最佳方式实施更新查询集作为使用executeBatch()的批次作为批次



在以下方法中,我尝试运行更新查询作为批次。但是这种方法会不时悬挂在运行时。我的假设是,由于某种原因,它会在sample_table上创建一个db表锁定,然后在再次运行executeBatch时,它会等待锁定锁定。最终使过程挂起。

我的问题是

  1. 这是否是实现批次执行更新查询的最佳方法?
  2. 是否应该不将自动启动设置为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 );
    }
}

如果您可以使用Spring,则有一个简单的选择:

jdbctemplate.batchupdate(查询,insertparameters)。我已经测试了数百万笔交易,仅需几秒钟。

相关内容

  • 没有找到相关文章

最新更新