gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:55:59 26 4
gpt4 key购买 nike

好吧,想象一下这种情况。我对 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 调用中的第一个方法调用。这将从您的 session 中清除包状态。不推荐这种方法,因为它会产生性能开销,而且任何包范围内的变量都会被重置,因此需要再次调用包初始化 block - 另一个性能影响。

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

关于java - Tomcat 是否使用 pl/sql 模块的缓存版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4885499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com