с 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
.