轉自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),否則會報錯。