met rewriteBatchedStatements=true zal de JDBC zoveel mogelijk query's in een enkel netwerkpakket verpakken, waardoor de netwerkoverhead wordt verlaagd. Heb ik gelijk?
Ja. De volgende 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();
}
}
zal individuele INSERT-instructies verzenden, ook al heb ik een batch gemaakt
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Als ik echter de verbindingsreeks wijzig om rewriteBatchedStatements=true
op te nemen,
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
dan zal JDBC een of meer INSERT-instructies met meerdere rijen verzenden
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
kent JDBC de waarde die is toegewezen aan max_allowed_packet en maakt het daarom het pakket kleiner dan de gedefinieerde waarde voor max_allowed_packet ... ?
Ja. Als u het algemene MySQL-logboek inschakelt en dit aanvinkt, zult u zien dat MySQL Connector/J een aantal variabelen inspecteert wanneer het verbinding maakt, waaronder max_allowed_packet
. Je kunt ook een klein max_allowed_packet
. instellen waarde en controleer of JDBC een batch splitst in meerdere INSERT-instructies met meerdere rijen als een enkele dergelijke instructie voor de hele batch max_allowed_packet
zou overschrijden .