求破:在java里执行executeBatch时卡住

叶落花开 发布于 2014/02/19 15:17
阅读 3K+
收藏 0
 

问一下下述这段代码,在本机tomact+oracel环境执行"pst.executeBatch()"总是卡住走不下去了,也不抛异常。

但是在正式线上又是运行OK的,求解怎么解决这个问题!先行拜谢!!!

for(int i=0;i<orderIdList.size();i++){
    pst.setString(1,updateDate); 
    pst.setString(2,orderIdList.get(i)); 
    pst.addBatch();//加入批处理,进行打包 
    if(i>0&&i%499==0){//可以设置不同的大小;如50,100,500,1000等等
        pst.executeBatch();
        conn.commit();
        pst.clearBatch();
        size+=500;
    } 
 }
 if(orderIdList.size()%500!=0){
     pst.executeBatch();
     conn.commit();
     pst.clearBatch();
     size+=(orderIdList.size()%500);
 }



加载中
0
guor
guor

代码应该没问题

本机环境下使用的数据库有问题哈,应该有地方的更新操作没有提交导致无法再次更新数据

叶落花开
叶落花开
亲,你真相了,这段代码是放在service里的,在这段代码的上边是调用dao进行数据更新,紧接我又调用jdbctemplate进行数据批量更新,上一个事务还没提交,导致这段代码执行不了。
0
superxinlee
superxinlee
有两处 executeBatch()方法,也不知道你说的是哪个。tomcat也没有error log吗?卡在这句说明 executeBatch()方法里面有问题,你给出这段代码没什么用啊。也不知道你这是不是多线程问题,这些信息是不够的。
叶落花开
叶落花开
不好意思,指的是第六行的。tomcat确实没有error log。而且正式线运行是正常的,百思不得其解。
0
whaon
whaon

目测是其他地方操作数据库导致锁表

你可以杀掉锁表进程看,找出什么地方锁表了

叶落花开
叶落花开
也谢谢大侠了哈
0
N
NO0

1、看下有没有锁表

2、数据量大,更新条件没建索引或者传值数据类型不匹配导致每条更新都全表扫描,从而导致假死

返回顶部
顶部