我們遇到了不可預知的錯誤,指出在Java中使用Callable語句執行過程調用時,'索引中缺少參數或索引:7'。 在每個過程調用中,我們都沒有關閉連接。這是問題嗎?IBM Websphere門戶網站服務器中的非已關閉的oracle連接
注意:代碼實現不是直接調用過程的代碼。我們有內部框架,負責數據庫調用所以很難發佈完整的代碼。
我們遇到了不可預知的錯誤,指出在Java中使用Callable語句執行過程調用時,'索引中缺少參數或索引:7'。 在每個過程調用中,我們都沒有關閉連接。這是問題嗎?IBM Websphere門戶網站服務器中的非已關閉的oracle連接
注意:代碼實現不是直接調用過程的代碼。我們有內部框架,負責數據庫調用所以很難發佈完整的代碼。
除非您自己創建連接,否則不需要關閉連接。但是,您確實需要關閉CallableStatement
。
此外,缺少參數或缺少參數表明,與可調用語句中指定的數量或參數相比,該過程需要綁定更多參數。
如果上述情況不是這樣,那麼您可能會得到它,因爲您沒有綁定語句中的參數。
實施例:
call MY_PROC(?,?)
需要綁定在java代碼2個參數它。但是,正如你所說的那樣,它不會總是發生,也許你的一個參數綁定是在發生錯誤時不滿足if
條件。
如果缺少代碼片段(如果您可以發佈它會有幫助),我們只能推測可能的原因。在inout參數中指出的一點是,您需要爲它們設置輸入值,statement.setX(n,value)和將它們註冊爲輸出參數,每次使用它們時都使用statement.registerOutParameter(n,type) 。請參閱從Oracle JDBC文檔此鏈接爲一個更完整的例子:
http://docs.oracle.com/javadb/10.10.1.2/ref/rrefjdbc75719.html
你也想知道在WebSphere Application Server數據源默認情況下(在CallableStatement.close),其中涉及調用緩存與CallableStatements CallableStatement.clearParameters具有清除參數值並釋放它們所持資源的效果。它可能也會清除輸出參數的註冊。要嘗試禁用語句緩存,請在數據源上配置statementCacheSize = 0。或者,如果使用JDBC 4.0或更高版本,可以通過CallableStatement.setPoolable(false)將單個語句設置爲不可緩存。清楚起見,我並不建議將語句緩存作爲解決方案禁用,只是作爲幫助您縮小原因的實驗。
代碼實現不是直接代碼,它調用過程。我們有內部框架,負責數據庫調用所以很難發佈完整的代碼。但是你的回答會幫助我解決實施問題。一旦根據您的建議解決問題,您的答案將會消失。 – Hareesh
確實接受答案,如果你覺得有幫助 – MozenRath