với rewriteBishedStatements =true, JDBC sẽ đóng gói càng nhiều truy vấn càng tốt vào một gói mạng duy nhất, giảm chi phí mạng theo cách này. Tôi nói đúng chứ?
Đúng. Đoạn mã sau
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();
}
}
sẽ gửi các câu lệnh INSERT riêng lẻ mặc dù tôi đã tạo một Batch
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Tuy nhiên, nếu tôi thay đổi chuỗi kết nối để bao gồm rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
thì JDBC sẽ gửi một hoặc nhiều câu lệnh INSERT nhiều hàng
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
JDBC có biết giá trị được gán cho max_allowed_packet và do đó làm cho gói nhỏ hơn giá trị được xác định cho max_allowed_packet ...?
Đúng. Nếu bạn bật nhật ký chung MySQL và kiểm tra nó, bạn sẽ thấy rằng MySQL Connector / J kiểm tra một loạt các biến khi nó kết nối, một trong số đó là max_allowed_packet
. Bạn cũng có thể đặt một max_allowed_packet
nhỏ giá trị và xác minh rằng JDBC chia một lô thành nhiều câu lệnh INSERT nhiều hàng nếu một câu lệnh như vậy cho toàn bộ lô sẽ vượt quá max_allowed_packet
.