gpt4 book ai didi

java - 有效处理java.sql.SQLException : ORA-04068

转载 作者:行者123 更新时间:2023-11-30 10:52:26 25 4
gpt4 key购买 nike

我得到以下异常:

Caused by: java.sql.SQLException: ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "PACKAGE_A" has been invalidated
ORA-04065: not executed, altered or dropped package body "PACKAGE_A"
ORA-06508: PL/SQL: could not find program unit being called: "PACKAGE_A"

版本:

Java 1.7.x 和 oracle 11.4.x

根本原因: PACKAGE_A 具有全局变量声明状态。包规范(不是主体)已被重新编译,调用 PACKAGE_B 的 java 服务在内部调用 PACKAGE_A 已抛出此异常,直到我们重新启动这些服务。

我知道状态不应该出现在包规范中。但我正在寻找可行的解决方案无需更改 JAVA 中的代码

我从其他与此主题相关的 SE 问题中找到了两个解决方案。

选项 1:

Defining packages with `PRAGMA SERIALLY_REUSABLE` 

选项 2:

exec DBMS_SESSION.RESET_PACKAGE
exec DBMS_SESSION.MODIFY_PACKAGE_STATE( DBMS_SESSION.REINITIALIZE)

选项 3:

从包中删除全局变量。

如果我没有永远选择选项 3,那么使用选项 1 和选项 2 的缺点是什么?

这些选项是否会导致数据库性能开销?选项 3 是否提供最佳解决方案?

最佳答案

这是 Oracle 的标准行为,因为它在每个 session 的 session 内存中保留了包的编译实例。由于所有包状态在一个 session 中都是有效的(即一个包变量在两个数据库 session 中可以具有不同的值),因此包变量值也绑定(bind)到一个 session 。

现在,如果您更改包,Oracle 必须为所有 session 重新加载包。到目前为止,一切都很好。但是,当您更改代码时,包变量会丢失。这就像在代码更改后停止并重新启动应用程序——变量正在丢失。

这个优雅的异常表明现在包变量正在丢失。

根据您使用包变量的方式,这可能会导致您的应用程序出现问题 - 因此会出现异常。


但在现实生活中,所有的包变量都被使用,以便它们按需初始化(例如,使用 plsql 表的老派缓存),并且没有人应该保留持久数据(例如,网上商店中购物车的内容app) 在包变量中。事实上,包变量 - 尽管看起来是持久的 - 应该被视为 transient 在调用之间具有乐观的持久性

如果你能遵守这个规则,那么你就可以很容易地处理这个异常:

  • 不要更改包代码:) 好吧,开个玩笑
  • 收到此异常时,只需重新运行失败的 pl/sql 调用即可。

即:

  • 调用 addCustomer(?,?,?)
  • 你有一个 java.sql.SQLException: ORA-04068
  • 现在再次调用相同的 addCustomer(?,?,?)

关于java - 有效处理java.sql.SQLException : ORA-04068,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34339380/

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