z rewriteBatchedStatements=true JDBC spakuje jak najwięcej zapytań w pojedynczym pakiecie sieciowym, zmniejszając w ten sposób obciążenie sieci. Czy mam rację?
Tak. Poniższy kod
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();
}
}
wyśle indywidualne wyciągi INSERT, mimo że utworzyłem partię
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Jeśli jednak zmienię ciąg połączenia, aby zawierał rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
następnie JDBC wyśle jedno lub więcej wielowierszowych instrukcji INSERT
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
czy JDBC zna wartość przypisaną do max_allowed_packet i dlatego sprawia, że pakiet jest mniejszy niż zdefiniowana wartość dla max_allowed_packet ...?
Tak. Jeśli włączysz ogólny dziennik MySQL i sprawdzisz go, zobaczysz, że MySQL Connector/J sprawdza kilka zmiennych podczas łączenia, z których jedną jest max_allowed_packet
. Możesz także ustawić mały max_allowed_packet
i sprawdź, czy JDBC dzieli partię na kilka wielowierszowych instrukcji INSERT, jeśli pojedyncza taka instrukcja dla całej partii przekroczyłaby wartość max_allowed_packet
.