MySQL и JDBC с параметром rewriteBatchedStatements=true

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

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

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

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

Если я что-то не так понял, пожалуйста, дайте мне знать.


person dazito    schedule 10.10.2014    source источник
comment
Почему отрицательный голос? Хочешь объяснить?   -  person dazito    schedule 11.10.2014
comment
связано ли свойство rewriteBatchedStatements и hibernate.jdbc.batch_size? Я предполагаю, что свойство batch_size определяет, сколько значений будет добавлено в одну вставку. Просьба уточнить!   -  person Dhruv Bansal    schedule 14.11.2018


Ответы (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.

person Gord Thompson    schedule 11.10.2014
comment
но у ACID есть побочный эффект: без rewriteBatchedStatements мы можем вставить часть строк, но теперь мы можем ничего не вставлять, даже если есть только один дублирующийся ключ. - person auntyellow; 31.12.2014
comment
Просто примечание: вы не должны закрывать con и ps, потому что они будут автоматически закрыты блоком try-with-resources. - person Benjamin; 28.04.2016
comment
@GordThompson есть идеи, почему rewriteBatchedStatements по умолчанию имеет значение false для mysql? Есть ли какие-либо затраты/недостаток в его включении? - person Suren Aznauryan; 14.11.2018
comment
С чем-то вроде этого лучше иметь добровольную философию, а не навязанную вам. Но на вопрос, в нем (как и во всех базах кода) могут быть ошибки (надеюсь, нет). google.com/ - person granadaCoder; 31.03.2021