MySQL и JDBC с rewriteBatchedStatements = true

Я читал, здесь, здесь и здесь о преимуществах использования rewriteBatchedStatements=true

Если я правильно понял, с rewriteBatchedStatements=true JDBC упаковал бы как можно больше запросов в один сетевой пакет, уменьшив таким образом сетевые издержки. Я прав?

Затем мне приходит в голову, что значение, определенное на сервере MySQL для max_allowed_packet, может вызвать проблемы с запросами (запросы не выполняются на сервере).

Итак, мой второй вопрос: знает ли JDBC значение, назначенное max_allowed_packet, и поэтому делает пакет меньше заданного значения для max_allowed_packet или это то, что разработчик должен принять во внимание?

Если я понял что-то не так, сообщите мне об этом.

Ответ 1

с rewriteBatchedStatements = true, JDBC будет собирать как можно больше запросов в один сетевой пакет, снижая таким образом сетевые издержки. Я прав?

Да. Следующий код

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

отправит отдельные инструкции INSERT, даже если я создал пакетный

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

Однако, если я изменю строку подключения, включив rewriteBatchedStatements=true

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

то JDBC отправит один или несколько операторов с несколькими строками INSERT

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

знает ли JDBC значение, назначенное max_allowed_packet, и поэтому делает пакет меньше заданного значения для max_allowed_packet...?

Да. Если вы включите общий журнал MySQL и проверите его, вы увидите, что MySQL Connector/J проверяет кучу переменных при подключении, один из которых - max_allowed_packet. Вы также можете установить небольшое значение max_allowed_packet и убедиться, что JDBC разбивает пакет на несколько многострочных операторов INSERT, если один такой оператор для всей партии превысит max_allowed_packet.