MySQL e JDBC com rewriteBatchedStatements = true

Eu tenho lido em torno, aqui , aqui e aqui sobre as vantagens de usar rewriteBatchedStatements=true

Se eu entendi direito, com rewriteBatchedStatements=true o JDBC irá empacotar o maior número possível de consultas em um único pacote de rede, diminuindo assim a sobrecarga da rede. Estou certo?

Então vem a minha atenção que o valor definido no servidor MySQL para o max_allowed_packet pode causar problemas com as consultas (consultas não sendo executadas no servidor).

Então, minha segunda pergunta é: o JDBC sabe o valor atribuído a max_allowed_packet e, portanto, torna o pacote menor que o valor definido para max_allowed_packet ou é algo que o desenvolvedor deve levar em consideração?

Se eu entendi algo errado, por favor me avise também.

com rewriteBatchedStatements = true, o JDBC irá empacotar o maior número possível de consultas em um único pacote de rede, reduzindo assim a sobrecarga da rede. Estou certo?

Sim. O seguinte código

 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(); } } 

enviará instruções INSERT individuais mesmo que eu tenha criado um Batch

 INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...') INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...') 

No entanto, se eu alterar a string de conexão para include rewriteBatchedStatements=true

 String myConnectionString = "jdbc:mysql://localhost:3307/mydb?" + "useUnicode=true&characterEncoding=UTF-8" + "&rewriteBatchedStatements=true"; 

então o JDBC irá enviar uma ou mais instruções INSERT multi-row

 INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...') 

O JDBC conhece o valor atribuído a max_allowed_packet e, portanto, torna o pacote menor que o valor definido para max_allowed_packet ...?

Sim. Se você habilitar o log geral do MySQL e verificar, você verá que o MySQL Connector / J inspeciona um monte de variables ​​quando se conecta, uma das quais é max_allowed_packet . Você também pode definir um pequeno valor de max_allowed_packet e verificar se o JDBC divide um lote em várias instruções INSERT de várias linhas se uma única instrução desse tipo para todo o lote exceder o max_allowed_packet .