次の方法では、更新クエリをバッチとして実行しようとしています。ただし、このメソッドは実行時に時々ハングします。私の推測では、何らかの理由で sample_table に DB テーブル ロックが作成され、executebatch が再度実行されると、ロックが解放されるまで待機します。最終的にプロセスをハングさせます。
私の質問は
- これがバッチ実行の更新クエリを実装する最良の方法であるかどうか?
- autocommit を false に設定してから、ループ内の各 ps.executeBatch() の後にコミットしないでください。
- すべてのバッチを追加してから、各バッチを何度もコミットまたはコミットすると、パフォーマンスが向上します。
注: 更新されるレコードの数は最大 9000 レコード (9000 ID) になり、batchSize変数は 1000 に設定されます。
private void updateMethod( List<Long> idList)
{
int batchSizeCount = 0;
PreparedStatement ps = null;
ResultSet rs = null;
Connection con = criteriaWrapper.getConnection();
StringBuilder sb = new StringBuilder( "UPDATE sample_table SET column_name1 = 1 , column_name2 = SYSTIMESTAMP WHERE sample_table.table_id = ? " );
try
{
con.setAutoCommit( false );
ps = con.prepareStatement( sb.toString() );
for(Long table_id : idList)
{
int count = 0;
ps.setLong( ++count, table_id );
ps.addBatch();
if ( ++batchSizeCount % batchSize == 0 )
{
ps.executeBatch();
functionProvider.logger(); //Prints previously appended logs
}
}
ps.executeBatch();
con.commit();
con.setAutoCommit( true );
}
catch ( Exception e )
{
e.printStackTrace();
}
finally
{
DBUtility.close( rs );
DBUtility.close( ps );
}
}