我们有一个每天执行oracle-plsql函数的批处理作业。实际上,quartz调度器调用一个java程序,该程序调用oracle-plsql函数。这个oracle plsql函数从4个表中删除超过6个月的数据,然后提交事务。
这个批处理作业在测试环境中成功运行,但是当2周前发生的新数据被转储到表中时开始失败(代码应该在本周进入生产)。早些时候,每个表中的行数不超过10万。但现在3个表是100万,另一个表是240万。
运行3小时后,我们在java中得到一个错误(写在日志文件中)"…连接重置;嵌套异常是java.sql.SQLException: Io exception: Connection reset...."。当检查表上的行计数时,很明显没有从任何表中删除记录。
在oracle数据库中,当连接超时且调用会话不再活跃时,plsql过程/函数是否可能自动终止/杀死?
提前感谢,Pradeep .
PL/SQL不会因为处于非活动状态而终止,因为根据定义它不是——它仍然在做一些事情。但是,它不会生成任何网络流量返回到您的客户端。
似乎是网络层面的问题导致连接被终止。这可能是侦听器超时、防火墙超时或其他东西。如果在三个小时后仍然如此,那么几乎可以肯定这是在某处配置的超时,而不是网络故障,这将是更随机的(并且可能是可恢复的)。
当网络连接中断时,Oracle会在某个时刻注意到并终止会话。这将导致PL/SQL调用被终止,这将导致它所做的任何工作被回滚,这可能需要一段时间。
3小时对你的删除来说似乎很长,尽管对几百万条记录来说也是如此。也许您的删除效率不高,在过程中使用单个插入。当然这对你没有帮助。可能值得指出的是,您的生产环境可能没有终止连接的任何设置,或者可能具有更短的超时,因此即使减少运行时也可能无法使其在活动中防弹。您可能需要找到超时的来源,并在活动环境中检查相应的超时。以防止类似的问题发生