内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。
如果我们在第一次尝试中得到了ORA-04068错误,那么我们在会话1中重新执行这个包会发生什么呢?让我们看一下。
session1>execpkg.p
PL/SQLproceduresuccessfullycompleted.
如同你所看到的,第二次执行显示调用应用程序(在这个例子中是SQL*Plus)调整为新的状态(自从Oracle通知了一次改变的状态)并重新执行有了新状态的包。这是Oracle 所建议的动作(查看这一节的开始部分):
在恰当地重新初始化任何应用程序状态之后重新尝试。
下面讲述ORA-04068错误的一些影响。
“ORA-04068”错误的影响
要测量ORA-04068的影响,你所要做的一切就是google它。它的两个主要影响如下:
大多数企业应用程序使用缓存连接的连接池。现在无论何时部署一个新的包规范,都需要在生产过程中重新编译。你编译的时候,对于连接池中的所有连接,这个包的状态都会被无效化,因为这个包在获得连接之后进行了重新编译(作为连接池初始化的一部分,有时更早)。注意,无论你是否改变这个状态,无论你是否改变代码,都会如此。当一个存储过程或一个函数第一次被调用时,它将会失败并抛出“ORA-04058”错误。所以一般情况下,你需要记住要“刷出”连接池(意味着丢弃现有连接并获得到Oracle的新连接)。这通常导致应用程序部署的一个停机。例如,如果你正在使用tomcat 和在tomcat 中的一个连接池,那么你可能需要停止tomcat 并重启——以便它重新初始化连接池。那么如果有一个长时间运行的批处理正在使用一个连接来执行与需要重新编译的包完全无关的一些逻辑呢?那么你或者需要等待这个批处理执行完毕或者在部署过程中将它关闭以便你可以重新初始化连接池。正如你可能想到的,这在应用程序有效性方面会是个梦魇。
来源:IT专家网 作者:戴羽 责编:豆豆技术应用