在项目中,遇到一个问题,如下:
我的本意是想在执行ps1.executeBatch()时,如果发生了ORA-00001异常就忽略,事务继续,但事实却是发生了ORA-00001异常后,ps2.setString之类的set方法就不能用了,甚至conn.PrepareStatement("")也不能用了,finally块内的conn.setAutoCommit(true)也报异常,大概报的都是连接当前不被管理之类的异常,为什么啊?难道setAutoCommit(false),事务自己控制后,如果发生了SqlException,驱动会自动调用conn.rollback()释放资源,然后conn和其他statement都不能用了?因代码在公司,我在家发的帖子,没有源码,但大概代码结构如下(各位大侠不用深究下面代码的逻辑的正确性,随手写的,只是想表达一下我的问题):try
{
conn=getConnection();
conn.setAutoCommit(false);
ps1=conn.PreparedStatement("delete from TABLE1 where a=?");
ps2=conn.PreparedStatement("insert TABLE1(a,b,c) values(?,?,?)");
ps3=conn.PreparedStatement("update TABLE2 SET zz=? where xx=?");
ps4=conn.PreparedStatement("insert TABLE1(xx,yy,zz) values(?,?,?)");ps1.setString(1,'aa')
……ps1.addBatch();ps2.setString(1,'bb')
……
ps2.addBatch();
try
{
   ps1.executeBatch();
}
catch(SqlException e)
{
   if(e.getMessage().indexOf('ORA-00001')>0)
   {
      
   }
   else
   {
      ps1.close();
      throw e;
   }
}ps2.executeBatch();ps3.setInt(1,1);
……
ps3.addBatch()
ps3.executeBatch();ps4.setInt(1,1);
……
ps4.addBatch()
ps4.executeBatch();conn.commit();
}
catch(SqlException ex)
{
   conn.rollback();
   throw ex;
}
finally
{
    conn.setAutoCommit(true);
    ps1.close();
    ps2.close();
    ps3.close();
    ps4.close();
    conn.close();
    ps1=null;
    ps2=null;
    ps3=null;
    ps4=null;
    conn=null;
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【yjbhly】截止到2008-07-14 22:30:43的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    ORA-0001是主键冲突错误,但我想发生主键冲突还是和后面的操作保持一个事物,不行吗。发生异常后,oracle jdbc驱动会怎么处理链接和同一事物中的其他statement?下面是发生异常后,setAutoCommit(true)抛的异常:
     Connection handle is not currently associated with a ManagedConnectionps2的set方法甚至抛NullPointerException。没其他办法可想了吗?
      

  3.   

    我看到楼主的代码中,出现主键冲突异常之后没有做任何处理就直接执行后面的语句。
    建议楼主在发生异常后,先把 Statement 关闭掉,然后在执行下面的语句。
      

  4.   

    更正:建议楼主在发生异常后先把 Statement 关闭掉并重新创建,然后再执行下面的语句。
      

  5.   

    谢谢建议
    可是ps2的set和addBatch逻辑和ps1是一起的,ps1.executeBatch()执行前ps2里面已经addBatch()了数据了,再重新创建statement以前的逻辑又要全部走一遍?而且ps1发生逐渐冲突后,我希望不冲突的ps1里面的数据还是能提交,把ps1关闭了,其数据就提交不了