【问题标题】:First call to a stored procedure, after successful compilation, fails. Oracle 10g第一次调用存储过程,编译成功后,失败。甲骨文 10g
【发布时间】:2011-12-20 14:16:51
【问题描述】:

我有一个 Oracle 10G 安装(Oracle 数据库 10g 企业版版本 10.2.0.3.0 - Prod)和一个 Java Web 应用程序,它通过 JDBC 连接调用 oracle 中的存储过程和函数。 SP 和函数是包的一部分。第一次调用SP或者函数,包编译成功后出现以下错误:

(我用“#schema-name#.#package-name#”替换了我们的架构名称和包名称)

ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "#schema-name#.#package-name#" has been invalidated
ORA-04065: not executed, altered or dropped package body "#schema-name#.#package-name#"
ORA-06508: PL/SQL: could not find program unit being called: "#schema-name#.#package-name#"
ORA-06512: at "#schema-name#.#package-name#", line 5393
ORA-06512: at line 1

下一次调用它时,一切都会按照它应该的方式运行。关于为什么以及如何防止这种情况发生的任何想法?

【问题讨论】:

    标签: oracle stored-procedures jdbc


    【解决方案1】:

    这是有状态的包的正常行为,即它们有主体变量。编译包时,必须丢弃现有状态,并且之前使用过该包的所有会话都会收到 ORA-04068 错误(编译该包的会话除外)。

    当您有一个 Web 应用程序时,我假设它使用一个连接池来保持会话处于活动状态。所以如果他们之前使用过这个包,他们都会受到影响。

    一种解决方法是调用DBMS_SESSION.RESET_PACKAGE,它会丢弃当前会话的所有包的状态。还有一个是检查是否可以摆脱会话状态,这与连接池结合起来有点问题。

    【讨论】:

    • 是的,我们正在使用连接池。我会在哪里调用 DBMS_SESSION.RESET_PACKAGE?
    • 您需要在编译期间停止来自 Web 应用程序的所有数据库访问,然后在收集池中的每个会话中调用它。刷新池中的所有连接可能更容易(即关闭它们并创建一个新连接)。
    【解决方案2】:

    如果不删除并重新创建您的会话,我认为没有任何方法可以解决这个问题..

    看看this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-31
      • 2018-10-19
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多