Ich habe herumgelesen, Hier, Hier und Hier über die Vorteile der Verwendung rewriteBatchedStatements=true
Wenn ich es richtig verstanden habe, mit rewriteBatchedStatements=true
das JDBC wird Pack so viele Abfragen wie möglich in einem einzigen Netzwerkpaket, wodurch der Netzwerk-Overhead gesenkt wird. Habe ich recht?
Dann fällt mir auf, dass der im MySQL-Server definierte Wert für die max_allowed_packet
kann Probleme mit den Abfragen verursachen (Abfragen werden nicht auf dem Server ausgeführt).
Meine zweite Frage ist also, ob JDBC den zugewiesenen Wert kennt max_allowed_packet
und machen das Paket daher kleiner als der definierte Wert für max_allowed_packet
oder das ist etwas, was der Entwickler berücksichtigen muss?
Falls ich etwas falsch verstanden habe, lasst es mich bitte auch wissen.
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 ändere, um sie einzuschließen rewriteBatchedStatements=true
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 feststellen, dass MySQL Connector/J eine Reihe von Variablen überprüft, wenn es eine Verbindung herstellt, darunter eine max_allowed_packet
. Sie können auch eine kleine einstellen max_allowed_packet
-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 die Grenze überschreiten würde max_allowed_packet
.
.
Warum die Ablehnung? Willst du es erklären?
– dazito
10. Oktober 14 um 20:45 Uhr
hängen rewriteBatchedStatements und die Eigenschaft hibernate.jdbc.batch_size zusammen? Ich gehe davon aus, dass die Eigenschaft batch_size bestimmt, wie viele Werte in einer Einfügung angehängt werden. Bitte klären Sie!
– Dhruv Bansal
14. November 18 um 13:09 Uhr