con rewriteBatchedStatements=true il JDBC impacchetta il maggior numero possibile di query in un singolo pacchetto di rete, riducendo in questo modo il sovraccarico della rete. Ho ragione?
Sì. Il seguente codice
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();
}
}
invierà singole istruzioni INSERT anche se ho creato un batch
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Tuttavia, se cambio la stringa di connessione per includere rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
quindi JDBC invierà una o più istruzioni INSERT a più righe
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
JDBC conosce il valore assegnato a max_allowed_packet e quindi rende il pacchetto più piccolo del valore definito per max_allowed_packet ... ?
Sì. Se abiliti il log generale di MySQL e lo controlli, vedrai che MySQL Connector/J esamina un sacco di variabili quando si connette, una delle quali è max_allowed_packet
. Puoi anche impostare un piccolo max_allowed_packet
valore e verificare che JDBC suddivida un batch in più istruzioni INSERT su più righe se una singola istruzione di questo tipo per l'intero batch supera max_allowed_packet
.