在以下方法中,我尝试将更新查询作为批处理运行。但是这种方法在运行时会不时挂起。我的假设是,由于某种原因,它在 sample_table 上创建了一个数据库表锁,然后当 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 );
}
}