addBatch()のメソッドの隣には、クラス内のメソッドPreparedStatementもあります。addBatch(String)Statement
一連の異なるSQLステートメントを処理したいので、addBatch(String)がパフォーマンスに関して何を意味するのかについての説明を探しています。このメソッドを使用するのは安全(かつ高速)ですか、それともJavaで同様のSQLステートメントをグループ化してグループで実行する方が良いですか?
addBatch()のメソッドの隣には、クラス内のメソッドPreparedStatementもあります。addBatch(String)Statement
一連の異なるSQLステートメントを処理したいので、addBatch(String)がパフォーマンスに関して何を意味するのかについての説明を探しています。このメソッドを使用するのは安全(かつ高速)ですか、それともJavaで同様のSQLステートメントをグループ化してグループで実行する方が良いですか?
バッチ処理を使用すると、関連するSQLステートメントをバッチにグループ化し、データベースへの1回の呼び出しでそれらを送信できます。
複数のSQLステートメントを一度にデータベースに送信すると、通信オーバーヘッドの量が減り、パフォーマンスが向上します。
addBatch(String sql)はインターフェイスjava.sql.StatementでaddBatch()定義され、java.sql.PreparedStatementはサブインターフェイスの1つで定義されますextends Statement。(その他はjava.sql.CallableStatement)
JAVADocによると
addbatch(String sql)PreparedStatementメソッドをorCallableStatementおよびsqlで呼び出すことはできません。通常、これはSQLINSERTまたはUPDATEステートメントです。
addBatch()一括挿入または一括更新操作が必要な場合に推奨されます。
バッチ実行にはいくつかのブロッキング要因があります
DB make/version.
JDBC driver make/version.
例:MySQLを使用している場合は、最新のドライバーを使用して、接続文字列にrewriteBatchedStatements = trueを追加し、statement.addBatch()が実際にバッチ挿入を作成するようにします。
また、自動コミットがfalseであることを確認する必要があります。Javaで使用可能なヒープメモリが制約されている場合に役立つカウンタexecuteBatchに到達するカウンタを維持します。
例:
conn.setAutoCommit(false);
PreparedStatement pStmt = conn.prepareStatement("INSERT INTO mytable (field1,field2) VALUES (?,?)");
for all values:
pStmt.setString(1,val1);
pStmt.setString(2,val2);
pStmt.addBatch();
if ( i % 1000 == 0) {
pstmt.executeBatch();// Execute every 1000 items
}
pstmt.executeBatch();
conn.commit();