web-dev-qa-db-ja.com

rewriteBatchedStatements = trueを使用したMySQLおよびJDBC

私は、 herehere 、および hererewriteBatchedStatements=trueを使用する利点

rewriteBatchedStatements=trueで正しく理解できれば、JDBCはできるだけ多くのクエリを単一のネットワークパケットにpackし、この方法でネットワークを下げますオーバーヘッド。私は正しいですか?

次に、max_allowed_packetに対してMySQLサーバーで定義された値がクエリ(サーバーで実行されていないクエリ)で問題を引き起こす可能性があることに気付きました。

私の2番目の質問は、JDBCはmax_allowed_packetに割り当てられた値を知っているので、パケットをmax_allowed_packetの定義値より小さくするか、開発者が考慮しなければならないことですか?

何か間違ったことを理解したら、私にも知らせてください。

41
dazito

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_pa​​cketに割り当てられた値を知っているので、パケットをmax_allowed_pa​​cket ...の定義された値より小さくしますか?

はい。 MySQL一般ログを有効にしてチェックすると、MySQL Connector/Jが接続時に変数の束を検査することがわかります。そのうちの1つはmax_allowed_packetです。また、小さなmax_allowed_packet値を設定し、バッチ全体の単一のそのようなステートメントがmax_allowed_packetを超える場合、JDBCがバッチを複数の複数行のINSERTステートメントに分割することを確認できます。

60
Gord Thompson