在项目中,遇到一个问题,如下:
我的本意是想在执行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;
}
我的本意是想在执行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;
}
楼主【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
Connection handle is not currently associated with a ManagedConnectionps2的set方法甚至抛NullPointerException。没其他办法可想了吗?
建议楼主在发生异常后,先把 Statement 关闭掉,然后在执行下面的语句。
可是ps2的set和addBatch逻辑和ps1是一起的,ps1.executeBatch()执行前ps2里面已经addBatch()了数据了,再重新创建statement以前的逻辑又要全部走一遍?而且ps1发生逐渐冲突后,我希望不冲突的ps1里面的数据还是能提交,把ps1关闭了,其数据就提交不了