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();