使用输入参数列表更新大量行的最快方法<;T>;从MyBatis到Oracle数据库
通过将MyBatis中的变量列表传递给Oracle DB,我正在更新大量数据 这种方法对我来说不够有效,逐行提交更新sql查询的方法,对于sql查询中的循环或Executor.batch服务,比我预期的要慢得多使用输入参数列表更新大量行的最快方法<;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=";"&
//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,但您需要正确执行。
我注意到两个问题
${}
引用参数会使每个语句都是唯一的,并防止驱动程序重用该语句(批处理执行器的好处基本上已经丧失)。有关{}
和${}
之间的区别,请参阅由于最佳
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}
推荐使用批处理执行器,但您需要正确执行。我注意到两个问题
${}
引用参数会使每个语句都是唯一的,并防止驱动程序重用该语句(批处理执行器的好处基本上已经丧失)。有关{}
和${}
之间的区别,请参阅由于最佳
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关于更新问题,可能有行被另一个线程锁定。