avec rewriteBatchedStatements=true, JDBC regroupera autant de requêtes que possible dans un seul paquet réseau, réduisant ainsi la surcharge du réseau. Ai-je raison ?
Oui. Le code suivant
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();
}
}
enverra des instructions INSERT individuelles même si j'ai créé un lot
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Cependant, si je change la chaîne de connexion pour inclure rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
alors JDBC enverra une ou plusieurs instructions INSERT multi-lignes
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
est-ce que JDBC connaît la valeur assignée à max_allowed_packet et rend donc le paquet plus petit que la valeur définie pour max_allowed_packet ... ?
Oui. Si vous activez le journal général MySQL et que vous le vérifiez, vous verrez que MySQL Connector/J inspecte un ensemble de variables lorsqu'il se connecte, dont l'une est max_allowed_packet
. Vous pouvez également définir un petit max_allowed_packet
value et vérifiez que JDBC divise un lot en plusieurs instructions INSERT à plusieurs lignes si une seule de ces instructions pour l'ensemble du lot dépasse max_allowed_packet
.