med rewriteBatchedStatements=true vil JDBC pakke så mange forespørgsler som muligt i en enkelt netværkspakke, hvilket på denne måde sænker netværksomkostningerne. Har jeg ret?
Ja. Følgende kode
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();
}
}
vil sende individuelle INSERT-udsagn, selvom jeg har oprettet en batch
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Men hvis jeg ændrer forbindelsesstrengen til at inkludere rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
så sender JDBC en eller flere INSERT-sætninger med flere rækker
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
kender JDBC den værdi, der er tildelt max_allowed_packet og gør derfor pakken mindre end den definerede værdi for max_allowed_packet ... ?
Ja. Hvis du aktiverer den generelle MySQL-log og tjekker den, vil du se, at MySQL Connector/J inspicerer en masse variabler, når den opretter forbindelse, hvoraf den ene er max_allowed_packet
. Du kan også indstille en lille max_allowed_packet
værdi og kontroller, at JDBC opdeler en batch i flere INSERT-sætninger med flere rækker, hvis en enkelt sådan sætning for hele batchen ville overstige max_allowed_packet
.