程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle出現超出打開游標最大數的解決方法,oracle游標

Oracle出現超出打開游標最大數的解決方法,oracle游標

編輯:Oracle教程

Oracle出現超出打開游標最大數的解決方法,oracle游標


本文實例講述了Oracle出現超出打開游標最大數的解決方法。分享給大家供大家參考,具體如下:

Java代碼在執行conn.createStatement()和conn.prepareStatement()的時候,實際上都是相當與在數據庫中打開了一個cursor。尤其是,假如你的createStatement和prepareStatement是在一個循環裡面的話,就會非常輕易出現這個問題。因為游標一直在不停的打開,而且沒有關閉。

一般來說,我們在寫Java代碼的時候,createStatement和prepareStatement都應該要放在循環外面,而且使用了這些Statment後,及時關閉。最好是在執行了一次executeQuery、executeUpdate等之後,假如不需要使用結果集(ResultSet)的數據,就馬上將Statement或PreparedStatement關閉。

對於出現ORA-01000錯誤這種情況,單純的加大open_cursors並不是好辦法,那只是治標不治本。實際上,代碼中的隱患並沒有解除。而且,絕大部分情況下,open_cursors只需要設置一個比較小的值,就足夠使用了,除非有非常非凡的要求。

假如你不使用連接池,那麼就沒有什麼問題,一旦Connection關閉,數據庫物理連接就被釋放,所有相關Java資源也可以被GC回收了。

但是假如你使用連接池,那麼請注重,Connection關閉並不是物理關閉,只是歸還連接池,所以PreparedStatement和ResultSet都被持有,並且實際占用相關的數據庫的游標資源,在這種情況下,只要長期運行,往往就會報“游標超出數據庫答應的最大值”的錯誤,導致程序無法正常訪問數據庫。

正確的代碼,如下所示:

for(int i=0;i<balancelist.size();i++)
{
  prepstmt = conn.prepareStatement(sql[i]);
  prepstmt.setBigDecimal(1,nb.getRealCost());
  prepstmt.setString(2, adclient_id);
  prepstmt.setString(3, daystr);
  prepstmt.setInt(4, ComStatic.portalId);
  prepstmt.executeUpdate();
  //循環到一定數量就要關閉,防止出現超出最大游標數量
  prepstmt.close();
}

希望本文所述對大家Oracle數據庫程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved