with 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
。
爲什麼要投票?謹慎解釋? – dazito 2014-10-10 20:45:44