可以想象这种情况。我对pl / sql模块进行了更改,重新编译它,一切都很好。没有错误。然后,我尝试在Tomcat上运行的应用程序上访问GUI屏幕。屏幕将调用oracle数据库中的pl / sql模块。
当我提交应调用该pl / sql模块处理数据的表格时,出现此错误
ORA-20001: ORA-06508: PL/SQL: could not find program unit being called
我检查了$ USER_OBJECTS中的所有软件包,没有任何一个状态为INVALID。
我重新启动了Tomcat,然后开始工作。这是否意味着当我第一次重新编译软件包时,我实际上就删除了对Tomcat使用的软件包的某些缓存引用?
与数据库的连接是通过JDBC和DBCP连接池进行的。重新编译是否会使连接无效?
此问题与JDBC连接池有关,这是所有使用JDBC连接池的应用程序服务器(不仅仅是Tomcat)遇到的问题。连接池将使池中的多个连接保持打开状态,以准备下一个请求。如果连接引用了PL / SQL程序包并对其进行了重新编译,则对该程序包的下一次调用将引发ORA-06508错误。这将影响调用堆栈中任何地方的包,而不仅仅是您直接调用的包。
为了解决这个问题,某些应用服务器(例如Weblogic)具有定期调用的测试方法。如果测试失败,则将连接从池中删除或以某种方式刷新。我不确定Tomcat有什么机制。
解决该问题的另一种方法是将dbms_session.reset_package作为JDBC调用中的第一个方法调用。这样可以清除会话中的程序包状态。不建议使用这种方法,因为它会产生性能开销,并且会重设所有程序包作用域的变量,因此需要再次调用程序包初始化块,这是另一个性能问题。
如果遇到问题,并且没有办法删除不良连接,则需要重置整个连接池,因为池中的任何连接都会遭受相同的异常。