dengan rewriteBatchedStatements=true JDBC akan mengemas kueri sebanyak mungkin ke dalam satu paket jaringan, dengan cara ini menurunkan overhead jaringan. Apakah saya benar?
Ya. Kode berikut
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();
}
}
akan mengirimkan pernyataan INSERT individual meskipun saya telah membuat Batch
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...')
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...')
Namun, jika saya mengubah string koneksi untuk menyertakan rewriteBatchedStatements=true
String myConnectionString =
"jdbc:mysql://localhost:3307/mydb?" +
"useUnicode=true&characterEncoding=UTF-8" +
"&rewriteBatchedStatements=true";
maka JDBC akan mengirimkan satu atau lebih pernyataan INSERT multi-baris
INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...')
apakah JDBC mengetahui nilai yang diberikan ke max_allowed_packet dan karenanya membuat paket lebih kecil dari nilai yang ditentukan untuk max_allowed_packet ... ?
Ya. Jika Anda mengaktifkan log umum MySQL dan memeriksanya, Anda akan melihat bahwa MySQL Connector/J memeriksa banyak variabel saat terhubung, salah satunya adalah max_allowed_packet
. Anda juga dapat mengatur max_allowed_packet
kecil nilai dan verifikasi bahwa JDBC membagi batch menjadi beberapa pernyataan INSERT multi-baris jika satu pernyataan tersebut untuk seluruh batch akan melebihi max_allowed_packet
.