Oracle存储过程捕获异常没有抛出导致的JDBC异常

????? 名字起的好拗口。

????? 这是一个关于执行超时的问题。

????? 业务场景是这样的:根据要求,需要每天生成若干报表(原始数据量约为4-5GB),使用一个总的存储过程调度几十个子存储过程(由于有依赖关系,存储过程需要串行执行),为了不影响当天的剩下的工作,生成报表有个容忍时间(2-3小时),超过时间后就需要强行终止。

????? 在测试中发现,使用setQueryTimeout()方法,或者cancel()方法,超时后存储过程确实终止了,并且在记录中可以看到“ORA-01013: 用户请求取消当前的操作”这个异常,但是下面再执行其他的SQL语句(简单的查询),在java端却也爆出了这个错误,导致该SQL执行出错,而且查看日志可以看到,爆出错误的链接(oracle.jdbc.driver.T4CConnection)和执行存储过程的链接是同一个,其他的连接就没问题。

????? 以上问题不管用最原始的JDBC,c3p0连接池还是用SpringJdbcTemplate,还是更新OJDBC驱动,都无法解决(数据库是Oracle10),最后折腾了半天也没发现是怎么回事。

???? 存储过程如下,模拟长时间执行:

?????

create or replace procedure pro_test is
 err_msg      varchar2(4000);
begin
for i in 1..60
loop
 insert into scott.prolog(id,date, info)values(i, sysdate,‘222‘);
 DBMS_LOCK.sleep(1);
  commit;
end loop;

 exception
  when others then
     err_msg := sqlerrm;
    rollback;
    insert into scott.prolog(id,date, info)values(‘err‘, sysdate,err_msg);
    commit;    
    return;

end;

?

????? 异常在存储过程中捕获,并进行记录,然后直接返回,但这种方式JDBC端察觉不到任何异常。

????? 最后,尝试在return之前抛出异常,利用下面的语句:

RAISE_APPLICATION_ERROR(-22222, ‘系统异常‘); 
return; 

?????? 然后,超时后JDBC可以捕获到-22222的SQLException,而且再用相同的链接执行任意SQL也不再报错了。

?

????? 具体什么原因导致了这种情况不得而知,暂且记录一下。盼望有高手解答。

?

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。