con rewriteBatchedStatements = true JDBC impacchetterà quante più query possibile in un singolo pacchetto di rete, riducendo così 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";
poi JDBC inviare una o più istruzioni INSERT multi-riga
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
JDBC conosce il valore assegnato a max_allowed_packet e pertanto rende il pacchetto più piccolo del valore definito per max_allowed_packet ...?
Sì. Se abiliti il log generale MySQL e lo controlli, vedrai che MySQL Connector/J ispeziona un gruppo di variabili quando si collega, una delle quali è max_allowed_packet
. È inoltre possibile impostare un valore piccolo max_allowed_packet
e verificare che JDBC suddivida un batch in più istruzioni INSERT a più righe se una singola dichiarazione di questo tipo per l'intero batch supera max_allowed_packet
.
fonte
2014-10-11 09:45:50
Perché il voto negativo? Cura di spiegare? – dazito