con rewriteBatchedStatements=true, JDBC empaquetará tantas consultas como sea posible en un solo paquete de red, reduciendo así la sobrecarga de la red. ¿Tengo razón?
Sí. El siguiente código
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();
}
}
enviará instrucciones INSERT individuales aunque haya creado un lote
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Sin embargo, si cambio la cadena de conexión para incluir rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
entonces JDBC enviará una o más instrucciones INSERT de varias filas
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
¿JDBC conoce el valor asignado a max_allowed_packet y, por lo tanto, hace que el paquete sea más pequeño que el valor definido para max_allowed_packet...?
Sí. Si habilita el registro general de MySQL y lo verifica, verá que MySQL Connector/J inspecciona un montón de variables cuando se conecta, una de las cuales es max_allowed_packet
. También puede establecer un pequeño max_allowed_packet
valor y verifique que JDBC divide un lote en varias declaraciones INSERT de varias filas si una sola declaración de este tipo para todo el lote excede max_allowed_packet
.