Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL und JDBC mit rewriteBatchedStatements=true

mit rewriteBatchedStatements=true packt JDBC so viele Abfragen wie möglich in ein einziges Netzwerkpaket und senkt so den Netzwerk-Overhead. Habe ich Recht?

Ja. Der folgende Code

String myConnectionString =
        "jdbc:mysql://localhost:3307/mydb?" +
        "useUnicode=true&characterEncoding=UTF-8";
try (Connection con = DriverManager.getConnection(myConnectionString, "root", "whatever")) {
    try (PreparedStatement ps = con.prepareStatement("INSERT INTO jdbc (`name`) VALUES (?)")) {
        for (int i = 1; i <= 5; i++) {
            ps.setString(1, String.format(
                    "Line %d: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", 
                    i));
            ps.addBatch();
        }
        ps.executeBatch();
    }
}

sendet einzelne INSERT-Anweisungen, obwohl ich einen Stapel erstellt habe

INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')

Wenn ich jedoch die Verbindungszeichenfolge so ändere, dass sie rewriteBatchedStatements=true enthält

String myConnectionString =
        "jdbc:mysql://localhost:3307/mydb?" +
        "useUnicode=true&characterEncoding=UTF-8" +
        "&rewriteBatchedStatements=true";

dann sendet JDBC eine oder mehrere mehrzeilige INSERT-Anweisungen

INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')

kennt JDBC den max_allowed_packet zugewiesenen Wert und macht das Paket daher kleiner als der definierte Wert für max_allowed_packet ... ?

Ja. Wenn Sie das allgemeine MySQL-Protokoll aktivieren und überprüfen, werden Sie sehen, dass MySQL Connector/J eine Reihe von Variablen überprüft, wenn es eine Verbindung herstellt, von denen eine max_allowed_packet ist . Sie können auch ein kleines max_allowed_packet setzen -Wert und vergewissern Sie sich, dass JDBC einen Stapel in mehrere mehrzeilige INSERT-Anweisungen aufteilt, wenn eine einzelne solche Anweisung für den gesamten Stapel max_allowed_packet überschreiten würde .