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
,