Rising Sun

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            148 隨筆 :: 0 文章 :: 22 評論 :: 0 Trackbacks

          癥狀:系統運行了一段時間報錯: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()方法。

          posted on 2013-05-29 09:53 brock 閱讀(199) 評論(0)  編輯  收藏 所屬分類: oracle 數據庫
          主站蜘蛛池模板: 东明县| 正安县| 额济纳旗| 兴业县| 临高县| 巴彦县| 密山市| 云林县| 灵璧县| 府谷县| 信丰县| 阳朔县| 鲁甸县| 东乌珠穆沁旗| 洱源县| 连南| 盐亭县| 旬邑县| 巫山县| 蕉岭县| 上饶县| 化州市| 苏尼特右旗| 益阳市| 海林市| 务川| 衡山县| 延边| 屏南县| 调兵山市| 禄丰县| 凤台县| 文登市| 镇坪县| 辽中县| 逊克县| 广州市| 仁化县| 肇庆市| 普安县| 托克托县|