2011-11-02 60 views
2

我有一個Oracle 10G安裝(Oracle數據庫10g企業版版本10.2.0.3.0 - 產品),以及一個java web應用程序,它通過JDBC連接在oracle中調用存儲過程和函數。 SP和功能是軟件包的一部分。第一次調用SP或函數時,在成功編譯包後,我得到以下錯誤:成功編譯後,首次調用存儲過程失敗。 Oracle 10g

(我用「#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 

下一次被調用時,所有事情都按照它應該的方式運行。關於爲什麼以及如何防止這種情況發生的任何想法?

回答

4

這是正常的行爲有狀態的包,即它們的身體變量。編譯包時,必須先分離現有狀態,並且在收到ORA-04068錯誤(編譯包的那個錯誤除外)之前已經使用該包的所有會話。

由於您有一個Web應用程序,我假設它使用連接池來保持會話的活動狀態。所以如果他們之前使用過這個軟件包,他們都會受到影響。

一種解決方法是調用DBMS_SESSION.RESET_PACKAGE,這會丟棄當前會話的所有包的狀態。另一個是檢查你是否可以擺脫會話狀態,這與連接池相結合有些問題。

+0

是的,我們正在使用連接池。我會在哪裏調用DBMS_SESSION.RESET_PACKAGE? – jworrin

+0

您需要在編譯期間停止從Web應用程序訪問所有數據庫,然後在收集池中的每個會話中調用它。刷新池中的所有連接可能會更容易(即關閉它們並創建一個新的連接)。 – Codo

0

我不認爲有解決這個辦法不刪除和重建您的會話..

看一看this

相關問題