j**a**在執行conn.createstatement()和conn.preparestatement()的時候,實際上都是相當與在資料庫中開啟了乙個cursor。尤其是,假如你的createstatement和preparestatement是在乙個迴圈裡面的話,就會非常輕易出現這個問題。因為游標一直在不停的開啟,而且沒有關閉。
一般來說,我們在寫j**a**的時候,createstatement和preparestatement都應該要放在迴圈外面,而且使用了這些statment後,及時關閉。最好是在執行了一次executequery、executeupdate等之後,假如不需要使用結果集(resultset)的資料,就馬上將statement或preparedstatement關閉。
對於出現ora-01000錯誤這種情況,單純的加大open_cursors並不是好辦法,那只是治標不治本。實際上,**中的隱患並沒有解除。而且,絕大部分情況下,open_cursors只需要設定乙個比較小的值,就足夠使用了,除非有非常非凡的要求gsrmefgp。
假如你不使用連線池,那麼就沒有什麼問題,一旦connection關閉,資料庫物理連線就被釋放,所有相關j**a資源也可以被gc**了。
但是假如你使用連線池,那麼請注重,connection關閉並不是物理關閉,只是歸還連線池,所以preparedstatement和resultset都被持有,並且實際占用相關的資料庫的游標資源,在這種情況下,只要長期執行,往往就會報「游標超出資料庫答應的最大值」的錯誤,導致程式無法正常訪問資料庫。
正確的**,如下所示:
for(int i=0;i
prepstmt.setstring(2, adclient_id);
prepstmt.setstring(3, daystr);
prepstmt.setint(4, comstatic.portalid);
prepstmt.executeupdate();
//迴圈到一定數量就要關閉,防止出現超出最大游標數量
prepstmt.cl
}本文標題: oracle出現超出開啟游標最大數的解決方法
本文位址:
超出開啟游標的最大值
zc 個人感覺,在 j a程式設計中,出現上述異常,基本是由於 資料庫操作沒有關閉 釋放 造成。1 來自網路 在j a 中,執行conn.createstatement 和conn.preparestatement 的時候,實際上都是相當與在資料庫中開啟了乙個curso 2 基本的情況為 每次 開啟...
oracle超出開啟游標的最大數的原因和解決方案
操作步驟 1 以oracle身份登入資料庫,命令 su oracle 2 進入sqlplus控制台,命令 sqlplus nolog 3 以系統管理員登入,命令 connect as sysdba 檢查資料庫中的 open cursors 引數值。5 修改open cursors sql alter...
oracle游標開啟方式
cursor cur1 is select a,b,c from dual select 語句可以是多個表,檢視 方式一 開啟游標,開始迴圈,從游標中取值,那一行被返回,處理,關閉迴圈,關閉游標 open cur1 loop 迴圈游標 fetch cur1 into v a,v b,v c 提取資料...