1. 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()方法。