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
से अधिक होगा ।