oracle ORA-01000: maximum open cursors exceeded問題的解決方法

轉自http://www.cnblogs.com/qinjunli/p/4588089.html

項目在運行過程中,後臺報錯:   

ORA-01000: maximum open cursors exceeded  
ORA-00604: error occurred at recursive SQL level 1  

      網上搜索了一下,找到了原因根源:

  使用Oracle數據庫的時候,經常會碰到有ORA-01000: maximum open cursors exceeded的錯誤。實際上,這個錯誤的原因,主要還是代碼問題引起的。  

  ora-01000: maximum open cursors exceeded:表示已經達到一個進程打開的最大遊標數。

  這樣的錯誤很容易出現在Java代碼中的主要原因是:Java代碼在執行conn.createStatement()和conn.prepareStatement()的時候,實際上都是相當與在數據庫中打開了一個cursor。尤其是,如果你的createStatement和prepareStatement是在一個循環裏面的話,就會非常容易出現這個問題。因爲遊標一直在不停的打開,而且沒有關閉。

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

  對於出現ORA-01000錯誤這種情況,單純的加大open_cursors並不是好辦法,那只是治標不治本。實際上,代碼中的隱患並沒有解除。

  而且,絕大部分情況下,open_cursors只需要設置一個比較小的值,就足夠使用了,除非有非常特別的要求。

解決方案 

一、從源頭上解決方案(建議)

  檢查代碼,把涉及到打開鏈接的地方,用完之後,千萬別忘記關掉。

二、臨時解決方案(不建議)

  通過修改oracle系統參數:將OPEN_CURSORS 的值設置得足夠大,以避免應用程序用盡所有打開的遊標。應用程序不同,該值也不同。即便會話打開的遊標數未達 OPEN_CURSORS 指定的數量(即設置的值高於實際需要的值), 也不會增加系統開銷。 

步驟如下:

複製代碼

--第一步:查看當前OPEN_CURSORS 的值 

SQL> show parameter open_cursors;  

NAME                                 TYPE        VALUE ------------------------------------ 
open_cursors                         integer     300


--第二步:查看修改之後是重啓oracle服務生效還是立即生效

SQL> show parameter spfile;  

NAME                                 TYPE        VALUE ------------------------------------ 
spfile                               string      /home/oracle/oracle/product/10.2.0/db_1/dbs/spfileeeim.ora

 

--第三步:修改遊標:open_cursors的值  

SQL> alter system set OPEN_CURSORS=1200; 

System altered

複製代碼

 

補充:修改系統參數時,scope有三個重要參數,如下:(我這裏因爲參數原本就是spfile,所以沒有這步,如果需要這步,這步應該在第三步之前執行)

alter system set parameter= value scope=spfile;  

SCOPE=MEMORY:只改變當前實例運行,亦即初始化參數改變了只對當前實例有效,當實例重啓之後,初始化參數值還原。

SCOPE=SPFILE:只改變SPFILE的設置。亦即改變初始化參數文件內容。實例重啓後參數生效。

SCOPE=BOTH:既改變實例也改變SPFILE。指定這個選項相當於不帶參數的alter system語句。需要注意的是,如果修改靜態參數,必須指定SPFILE參數(必須表明SCOPE=MEMOEY或者SCOPE=SPFILE),否則會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章