Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL e JDBC com rewriteBatchedStatements=true


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 Lote
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 incluir rewriteBatchedStatements=true
String myConnectionString =
        "jdbc:mysql://localhost:3307/mydb?" +
        "useUnicode=true&characterEncoding=UTF-8" +
        "&rewriteBatchedStatements=true";

então o JDBC enviará uma ou mais instruções INSERT de várias linhas
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 verificá-lo, verá que o MySQL Connector/J inspeciona um monte de variáveis ​​quando se conecta, uma das quais é max_allowed_packet . Você também pode definir um pequeno max_allowed_packet value e verifique 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 max_allowed_packet .