我有一個oracle stored proc
需要從我的Java程序調用。我曾使用CallableStatement
將參數傳遞給存儲過程。我正在使用oracle瘦驅動程序(在web邏輯服務器中針對相關的jndi條目進行配置)。此存儲過程沒有任何OUT值。這個存儲過程接受一個數值,並根據接收到的值在數據庫中做很多更新。的PreparedStatement,CallableStatement的和性能考慮
我得到一個連接對象,然後調用這個循環存儲過程(20次傳遞20號)。當我直接從oracle客戶端調用這個存儲過程時,執行會在2-3秒內完成。但是,這種行爲是不可預測的從我的java代碼。有些電話甚至需要30-40秒才能完成。
我試圖使用PreparedStatement
而不是CallableStatement
,並可以看到邊際性能的改善(儘管行爲仍然不一致)。
- 是否確定在我的情況下使用
PreparedStatement
,而不是CallableStatement
鑑於storedproc沒有任何OUT參數? - 沒有任何理由爲什麼
PreparedStatement
具有一定的性能增益超過CallableStatement
或者是它的東西,我可能會觀察是否有誤? - 解決這個性能問題有更好的方法嗎?
你能後的代碼?或者,確認每次迭代都沒有建立連接(而不是重複使用一個連接),並確認每次迭代都沒有調用'conn.prepareCall()'(而不是隻有'.setInt() )'和'.execute()'在循環中)。 – Matt 2012-01-05 18:56:36
您不止一次地調用存儲過程,對嗎?你有沒有嘗試過使用批量調用? http://docs.oracle.com/javase/1.3/docs/guide/jdbc/getstart/callablestatement.html請參閱7.1.3 – 2012-01-05 18:57:22
爲什麼不嘗試匿名PL/SQL塊(開始...調用過程...調用過程......結束;)調用你的存儲過程20次,並使用匿名塊對數據庫進行一次調用。 – GriffeyDog 2012-01-05 19:05:57