java - mysql url connection example
MySQL y JDBC con rewriteBatchedStatements=true (1)
He estado leyendo,
here
,
here
y
here
sobre las ventajas de usar
rewriteBatchedStatements=true
Si lo entendí bien, con
rewriteBatchedStatements=true
el JDBC
empaquetará
tantas consultas como sea posible en un solo paquete de red, reduciendo así la sobrecarga de la red.
Estoy en lo cierto?
Entonces me viene a la
max_allowed_packet
que el valor definido en el servidor MySQL para
max_allowed_packet
puede causar problemas con las consultas (las consultas no se ejecutan en el servidor).
Entonces, mi segunda pregunta es, ¿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
o eso es algo que el desarrollador debe tener en cuenta?
Si entendí algo mal, házmelo saber también.
con rewriteBatchedStatements = true, el JDBC empaquetará tantas consultas como sea posible en un solo paquete de red, reduciendo así la sobrecarga de la red. Estoy en lo cierto?
Si. 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á declaraciones INSERT individuales aunque haya creado un Batch
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 ...?
Si.
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 valor pequeño de
max_allowed_packet
y verificar que JDBC divide un lote en varias instrucciones INSERT de varias filas si una sola declaración de este tipo para todo el lote excedería
max_allowed_packet
.