症狀:系統運行了一段時間報錯:java.sql.SQLException: ORA-01000: 超出打開遊標的最大數java
step 1:
查看數據庫當前的遊標數配置slqplus:show parameter open_cursors;sql
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狀況:session
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()方法。hash