1

我们每天都有一个执行 oracle-plsql 函数的批处理作业。实际上,quartz 调度程序调用了一个 java 程序,该程序调用了 oracle-plsql 函数。这个 oracle plsql 函数从 4 个表中删除数据(超过 6 个月),然后提交事务。

此批处理作业在测试环境中成功运行,但当新数据转储到两周前发生的表时开始失败(该代码应该在本周投入生产)。早些时候,每个表中的行数不超过 10 万。但是现在3个表是100万,另外一个表是240万。

运行 3 小时后,java 中出现错误(写入日志文件)“...Connection reset; nested exception is java.sql.SQLException: Io exception: Connection reset....”。当检查表上的行数时,很明显没有从任何表中删除任何记录。

在 oracle 数据库中,当连接超时并且调用会话不再活动时,plsql 过程/函数是否可以自动终止/终止?

在此先感谢,普拉迪普。

4

1 回答 1

1

PL/SQL 不会终止,因为它不活动,因为根据定义它不是 - 它仍在做某事。不过,它不会产生任何网络流量返回您的客户端。

似乎网络级别的某些东西导致连接终止。这可能是侦听器超时、防火墙超时或其他。如果它在三个小时后始终如一,那么几乎可以肯定是在某处配置了超时,而不是网络故障,这将更加随机(并且可能是可恢复的)。

当网络连接中断时,Oracle 会在某个时间点通知并终止会话。这将导致 PL/SQL 调用被终止,这将导致它所做的任何工作被回滚,这可能需要一段时间。

即使对于几百万条记录,3 小时的删除时间似乎也很长。也许您的删除效率低下,在您的过程中使用了单独的插入。当然,这对你没有帮助。值得指出的是,您的生产环境可能没有任何设置会终止您的连接,或者可能有更短的超时时间,因此即使减少运行时间也可能无法使其在实时运行中变得万无一失。您可能需要找到超时的来源并检查实时环境中的等效项。试图先发制人那里的类似问题。

于 2013-06-18T17:27:10.747 回答