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

时间:2011-02-03 11:22:30

标签: java oracle tomcat plsql oracle10g

好想象一下这种情况。我对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连接池实现的。重新编译可能会使连接无效吗?

3 个答案:

答案 0 :(得分:4)

这个问题与JDBC连接池有关,并且是使用JDBC连接池而不仅仅是Tomcat的所有应用服务器所遇到的问题。连接池将在池中打开许多连接,为下一个请求做好准备。如果连接引用了PL / SQL包并重新编译,则对该包的下一次调用将引发ORA-06508错误。这将影响调用堆栈中任何位置的包 - 而不仅仅是您直接调用的包。

要解决此问题,某些应用服务器(如Weblogic)会定期调用测试方法。如果测试失败,则会从池中删除连接或以某种方式刷新连接。我不确定Tomcat有什么机制。

另一种解决方法是调用dbms_session.reset_package作为JDBC调用中的第一个方法调用。这将从您的会话中清除包状态。不推荐使用此方法,因为它具有性能开销,并且任何包范围的变量都会被重置,因此需要再次调用包初始化块 - 另一个性能损失。

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

答案 1 :(得分:2)

  

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

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

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

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

答案 2 :(得分:0)

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

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

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

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

没有正确数量和类型的参数

,正在调用

4)

相关问题