Tomcat是否使用pl / sql模块的缓存版本?

好想象一下这种情况。 我对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调用中的第一个方法调用。 这将从您的会话中清除包状态。 不建议使用此方法,因为它具有性能开销,并且任何包范围的变量都会被重置,因此需要再次调用包初始化块 – 另一个性能损失。

如果您遇到问题并且没有办法丢弃不良连接,则需要重置整个连接池,因为池中的任何连接都会遇到相同的exception。

该屏幕调用oracle数据库中的pl / sql模块。

不,它没有。 假设您在Tomcat上运行基于servlet的Web应用程序,那么您的浏览器会向Tomcat发送请求,Tomcat会调用相关的servlet,然后web-app中的某些java类将执行pl / sql程序作为CallableStatement

关键是java类如何执行CallableStatement以及它是否保留对它的引用或每次执行时都准备它。 你能否对此有所了解?

编辑:
我相信Oracle JDBC驱动程序能够执行语句缓存,这可能会导致问题。 阅读驱动程序文档以获取更多信息。

您获得的错误通常表示存储过程/包:

1)您尝试使用的名称不存在(来自您的Java类)

2)缺少对尝试执行它的用户(由JDBC连接定义)的授予EXECUTE特权

3)缺少一个同义词,如果它只是通过其名称执行(即没有前面的架构)

4)正在调用没有正确数量和类型的参数