med rewriteBatchedStatements=true kommer JDBC att packa så många frågor som möjligt i ett enda nätverkspaket, vilket minskar nätverkskostnaden på detta sätt. Har jag rätt?
Ja. Följande 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();
}
}
kommer att skicka individuella INSERT-satser trots att jag har skapat en batch
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Men om jag ändrar anslutningssträngen till att inkludera rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
sedan skickar JDBC en eller flera INSERT-satser med flera rader
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
känner JDBC till värdet som tilldelats max_allowed_packet och gör därför paketet mindre än det definierade värdet för max_allowed_packet ... ?
Ja. Om du aktiverar den allmänna MySQL-loggen och kontrollerar den kommer du att se att MySQL Connector/J inspekterar ett gäng variabler när den ansluter, varav en är max_allowed_packet
. Du kan också ställa in ett litet max_allowed_packet
värde och verifiera att JDBC delar upp en batch i flera INSERT-satser med flera rader om en enda sådan sats för hela batchen skulle överskrida max_allowed_packet
.