0

在以下方法中,我尝试将更新查询作为批处理运行。但是这种方法在运行时会不时挂起。我的假设是,由于某种原因,它在 sample_table 上创建了一个数据库表锁,然后当 executebatch 再次运行时,它等待锁被释放。最终使进程挂起。

我的问题是

  1. 这是否是实现批量执行更新查询的最佳方式?
  2. 我是否应该将 autocommit 设置为 false,然后在循环中的每个 ps.executeBatch() 之后提交。
  3. 哪个更有效,添加所有批次,然后一次又一次地提交或提交每个批次。

注意:更新的记录数可能高达 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 );
    }
}
4

1 回答 1

0

如果你可以使用弹簧,它有一个简单的选择:

jdbcTemplate.batchUpdate(查询,插入参数)。我已经测试了数百万笔交易,只需要几秒钟。

于 2016-06-16T11:21:24.083 回答