ORA-01000: 超出開啟遊標的最大數 問題的分析和解決
症狀:系統運行了一段時間報錯:java.sql.SQLException: ORA-01000: 超出開啟遊標的最大數
step 1:
檢視資料庫當前的遊標數配置slqplus:show parameter open_cursors;
step 2:
檢視遊標使用情況:
select o.sid, osuser, machine, count(*) num_curs
from v$open_cursor o, v$session s
where user_name = 'user' and o.sid=s.sid
group by o.sid, osuser, machine
order by num_curs desc;
此處的user_name='user'中,user代表佔用資料庫資源的資料庫使用者名稱.
step 3:
檢視遊標執行的sql情況:
select o.sid q.sql_text
from v$open_cursor o, v$sql q
where q.hash_value=o.hash_value and o.sid = 123;
step 4:
根據遊標佔用情況分析訪問資料庫的程式在資源釋放上是否正常,如果程式釋放資源沒有問題,則加大遊標數。
alter system set open_cursors=2000 scope=both;
補充:在java程式碼中,執行conn.createStatement()和conn.prepareStatement()的時候,實際上都是相當與在資料庫中打開了一個cursor。尤其是,如果你的createStatement和prepareStatement是在一個迴圈裡面的話,就會非常容易出現這個問題。因為遊標一直在不停的開啟,而且沒有關閉。
一般來說,我們在寫Java程式碼的時候,createStatement和prepareStatement都應該要放在迴圈外面,而且使用了這些Statment後,及時關閉。最好是在執行了一次executeQuery、executeUpdate等之後,如果不需要使用結果集(ResultSet)的資料,就馬上將Statment關閉,呼叫close()方