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は1つ以上の複数行の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が接続時に一連の変数を検査することがわかります。そのうちの1つはmax_allowed_packet
です。 。小さなmax_allowed_packet
を設定することもできます 値を設定し、バッチ全体の単一のそのようなステートメントがmax_allowed_packet
を超える場合、JDBCがバッチを複数の複数行のINSERTステートメントに分割することを確認します。 。