MySQL e JDBC con rewriteBatchedStatements = true

Ho letto, qui , qui e qui, i vantaggi dell’utilizzo di rewriteBatchedStatements=true

Se ho capito bene, con rewriteBatchedStatements=true JDBC impacchetterà quante più query possibili in un singolo pacchetto di rete, riducendo così il sovraccarico della rete. Ho ragione?

Poi mi viene in mente che il valore definito nel server MySQL per il max_allowed_packet può causare problemi con le query (query non eseguite sul server).

Quindi la mia seconda domanda è: JDBC conosce il valore assegnato a max_allowed_packet e quindi rende il pacchetto più piccolo del valore definito per max_allowed_packet o è qualcosa che lo sviluppatore deve prendere in considerazione?

Se ho capito qualcosa di sbagliato, per favore fatemelo sapere.

con rewriteBatchedStatements = true JDBC impacchetterà quante più query possibili 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"; 

quindi JDBC invierà 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 connette, una delle quali è max_allowed_packet . È inoltre ansible impostare un valore max_allowed_packet piccolo e verificare che JDBC suddivida un batch in più istruzioni INSERT a più righe se una singola istruzione di questo tipo per l'intero batch supera il valore max_allowed_packet .