Я читал повсюду, здесь, здесь и здесь о преимуществах использования rewriteBatchedStatements=true
Если я правильно понял, с rewriteBatchedStatements=true JDBC будет упаковывать как можно больше запросов в один сетевой пакет, снижая таким образом нагрузку на сеть. Я прав?
Затем мне становится известно, что значение, определенное на сервере MySQL для max_allowed_packet может вызвать проблемы с запросами (запросы не выполняются на сервере).
Итак, мой второй вопрос заключается в том, знает ли JDBC значение, присвоенное max_allowed_packet и, следовательно, делает пакет меньше определенного значения для max_allowed_packet или это то, что разработчик должен принять во внимание?
Если я что-то не так понял, пожалуйста, дайте мне знать.
Переведено автоматически
Ответ 1
с rewriteBatchedStatements = true JDBC упакует как можно больше запросов в один сетевой пакет, снижая таким образом нагрузку на сеть. Я прав?
ДА. Следующий код
StringmyConnectionString= "jdbc:mysql://localhost:3307/mydb?" + "useUnicode=true&characterEncoding=UTF-8"; try (Connectioncon= DriverManager.getConnection(myConnectionString, "root", "whatever")) { try (PreparedStatementps= con.prepareStatement("INSERT INTO jdbc (`name`) VALUES (?)")) { for (inti=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, даже если я создал пакет
INSERTINTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...') INSERTINTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Однако, если я изменю строку подключения на include rewriteBatchedStatements=true
затем JDBC отправит одну или несколько многострочных инструкций INSERT
INSERTINTO 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.