使用输入参数列表更新大量行的最快方法<;T>;从MyBatis到Oracle数据库

使用输入参数列表更新大量行的最快方法<;T>;从MyBatis到Oracle数据库,oracle,spring-boot,sql-update,mybatis,Oracle,Spring Boot,Sql Update,Mybatis,通过将MyBatis中的变量列表传递给Oracle DB,我正在更新大量数据 这种方法对我来说不够有效,逐行提交更新sql查询的方法,对于sql查询中的循环或Executor.batch服务,比我预期的要慢得多 //one of the method i use <update id="updateAll"> BEGIN <foreach collection="list" item="item" index="index" separator=";"&

通过将MyBatis中的变量列表传递给Oracle DB,我正在更新大量数据

这种方法对我来说不够有效,逐行提交更新sql查询的方法,对于sql查询中的循环或Executor.batch服务,比我预期的要慢得多

//one of the method i use
<update id="updateAll">
    BEGIN
        <foreach collection="list" item="item" index="index" separator=";">
            UPDATE <include refid="tableName"/>
            <set>
                item_price = ${item.price}, update_time = ${item.updateTime}
            </set>
            WHERE id = ${item.id}
        </foreach>
    ;END;
</update>

//我使用的方法之一
开始
更新
项目价格=${item.price},更新时间=${item.updateTime}
其中id=${item.id}
;结束;

按照我尝试过的方法,我的系统会花费10-30秒甚至更长的时间来完成更新。服务器每秒将有大约10000行数据。是否有任何方法可以在Oracle db中的1或2秒内更新至少1-2k行数据?

建议使用batch executor,但您需要正确执行。
我注意到两个问题

  • 设置适当的批量非常重要。最后发送的数据不是很有效
  • 使用
    ${}
    引用参数会使每个语句都是唯一的,并防止驱动程序重用该语句(批处理执行器的好处基本上已经丧失)。有关
    {}
    ${}
    之间的区别,请参阅
  • 这是一个使用MyBatis的典型批处理操作。
    由于最佳
    batchSize
    取决于各种因素,因此应使用实际数据衡量性能

    int batchSize=1000;
    try(SqlSession-SqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH)){
    YourMapper mapper=sqlSession.getMapper(YourMapper.class);
    int size=list.size();
    对于(int i=0;i
    下面是update语句的一个有效版本

    
    更新
    设置
    项目价格=#{item.price},
    更新时间=#{item.updateTime}
    其中id=#{item.id}
    
    推荐使用批处理执行器,但您需要正确执行。
    我注意到两个问题

  • 设置适当的批量非常重要。最后发送的数据不是很有效
  • 使用
    ${}
    引用参数会使每个语句都是唯一的,并防止驱动程序重用该语句(批处理执行器的好处基本上已经丧失)。有关
    {}
    ${}
    之间的区别,请参阅
  • 这是一个使用MyBatis的典型批处理操作。
    由于最佳
    batchSize
    取决于各种因素,因此应使用实际数据衡量性能

    int batchSize=1000;
    try(SqlSession-SqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH)){
    YourMapper mapper=sqlSession.getMapper(YourMapper.class);
    int size=list.size();
    对于(int i=0;i
    下面是update语句的一个有效版本

    
    更新
    设置
    项目价格=#{item.price},
    更新时间=#{item.updateTime}
    其中id=#{item.id}
    
    arhhh,我花了一整天的时间在这个符号上。。插入它的作品很好!!!但在使用update查询时,它会挂起并且不会在sql.flushstatement()上抛出错误。。无论如何谢谢你!!符号有时会毁了我们的一天:D关于更新问题,可能有行被另一个线程锁定。啊,我花了一整天的时间在这个符号上。。插入它的作品很好!!!但在使用update查询时,它会挂起并且不会在sql.flushstatement()上抛出错误。。无论如何谢谢你!!符号有时会毁了我们的一天:D关于更新问题,可能有行被另一个线程锁定。