亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

處理超出打開游標的最大數異常(ORA-01000: max

系統 1841 0
在執行如下代碼時,經常會出現ora-01000: maximum open cursors exceeded異常
for(int i=0;i<balancelist.size();i++)
{
???? prepstmt = conn.prepareStatement(sql[i]);
???? prepstmt.setBigDecimal(1,nb.getRealCost());
???? prepstmt.setString(2, adclient_id);
???? prepstmt.setString(3, daystr);
???? prepstmt.setInt(4, ComStatic.portalId);
???? prepstmt.executeUpdate();
}

1. 檢查數據庫中的 OPEN_CURSORS 參數值。
Oracle 使用 init.ora 中的初始化參數 OPEN_CURSORS 指定一個會話一次最多可以擁有的游標數。缺省值為 50。要獲得數據庫中 OPEN_CURSORS 參數的值,可以使用以下查詢:???
SQL> show parameter open_cursors;
NAME????????????????????????????????? TYPE???????? VALUE
------------------------------------ ----------- ---------------
open_cursors????????????????????????? integer????? 1000???

重要的是將 OPEN_CURSORS 的值設置得足夠大,以避免應用程序用盡所有打開的游標。應用程序不同,該值也不同。即便會話打開的游標數未達 OPEN_CURSORS 指定的數量(即設置的值高于實際需要的值),也不會增加系統開銷。
2. 獲取打開的游標數。
下面的查詢按降序顯示用戶“SCOTT”為每個會話打開的游標數。??
SQL> select o.sid, osuser, machine, count(*) num_curs
?? 2?? from v$open_cursor o, v$session s
?? 3?? where user_name = 'SCOTT' and o.sid=s.sid
?? 4?? group by o.sid, osuser, machine
?? 5 order by?? num_curs desc;
??? SID OSUSER??????? MACHINE??????????? NUM_CURS
-----------------------------------------------------
??????? 217??????????? m1???????????????? 1000
???????? 96??????????? m2???????????????? 10
??????? 411??????????? m3???????????????? 10
???????? 50?????????? test???????????????? 9
請注意,v$open_cursor 可以跟蹤會話中 PARSED 和 NOT CLOSED 的動態游標(使用 dbms_sql.open_cursor() 打開的游標)。它不會跟蹤未經分析(但已打開)的動態游標。在應用程序中使用動態游標并不常見。本模式的前提是未使用動態游標。
3. 獲取為游標執行的 SQL。
使用在以上查詢結果中找到的 SID 運行下面的查詢:
SQL> select q.sql_text
?? 2?? from v$open_cursor o, v$sql q
?? 3?? where q.hash_value=o.hash_value and o.sid = 217;
SQL_TEXT
select * from empdemo where empid='212'
select * from empdemo where empid='321'
select * from empdemo where empid='947'
select * from empdemo where empid='527'
...
結果將顯示正在連接上執行的查詢。它提供了一個入手點,讓您可以反向跟蹤到打開游標的來源。


這樣的錯誤很容易出現在Java代碼中的主要原因是:Java代碼在執行conn.createStatement()和 conn.prepareStatement()的時候,實際上都是相當與在數據庫中打開了一個cursor。尤其是,如果你的 createStatement和prepareStatement是在一個循環里面的話,就會非常容易出現這個問題。因為游標一直在不停的打開,而且沒 有關閉。
一般來說,我們在寫Java代碼的時候,createStatement和prepareStatement都應該要放在循環外面,而且使用了這些 Statment后,及時關閉。最好是在執行了一次executeQuery、executeUpdate等之后,如果不需要使用結果集 (ResultSet)的數據,就馬上將Statement或PreparedStatement關閉。
對于出現ORA-01000錯誤這種情況,單純的加大open_cursors并不是好辦法,那只是治標不治本。實際上,代碼中的隱患并沒有解除。
而且,絕大部分情況下,open_cursors只需要設置一個比較小的值,就足夠使用了,除非有非常特別的要求。
???? 如果你不使用連接池,那么就沒有什么問題,一旦Connection關閉,數據庫物理連接就被釋放,所有相關Java資源也可以被GC回收了。
但是如果你使用連接池,那么請注意,Connection關閉并不是物理關閉,只是歸還連接池,所以PreparedStatement和 ResultSet都被持有,并且實際占用相關的數據庫的游標資源,在這種情況下,只要長期運行,往往就會報“游標超出數據庫允許的最大值”的錯誤,導致 程序無法正常訪問數據庫。
正確的代碼,如下所示:
for(int i=0;i<balancelist.size();i++)
{
???? prepstmt = conn.prepareStatement(sql[i]);
???? prepstmt.setBigDecimal(1,nb.getRealCost());
???? prepstmt.setString(2, adclient_id);
???? prepstmt.setString(3, daystr);
???? prepstmt.setInt(4, ComStatic.portalId);
???? prepstmt.executeUpdate();
?? prepstmt.close();
}



在執行了一次executeQuery、executeUpdate等之后,如果不需要使用結果集(ResultSet)的數據,就馬上將Statement或PreparedStatement關閉。

處理超出打開游標的最大數異常(ORA-01000: maximum open cursors exceeded)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲最新视频在线观看 | 四虎成人精品在永久在线观看 | 国产精品麻豆一区二区 | 亚洲一区在线免费观看 | 日韩不卡视频在线观看 | 日韩美视频网站 | 涩涩精品| 99在线观看精品 | 亚洲欧洲中文日产 | 羞羞视频在线看 | 亚洲国产精品欧美综合 | 曰本一区二区 | 久久久这里只有精品免费 | 四虎4hu永久在线观看 | 欧美乱子伦一区二区三区 | 一级女人18片毛片免费视频 | 尤物视频国产 | 日韩欧美高清在线观看 | 成熟女人50岁一级毛片不卡 | 在线视频亚洲一区 | 国产 日韩 欧美 亚洲 | 亚洲欧美日韩在线 | 青青草国产一区二区三区 | 亚洲日本在线观看视频 | 99热999| 久久国产精品99久久久久久牛牛 | 国产中的精品一区的 | 久久精品免费一区二区视 | 97久久精品国产成人影院 | 98色花堂永久地址国产精品 | 四虎免费看黄 | 国产精品欧美久久久久天天影视 | 国产精品久久久久精 | 国产精品久久久久影院色老大 | 久久er国产精品免费观看2 | 久久国产亚洲观看 | 欧美一级毛片免费大全 | 国产亚洲精品热视频在线观看 | 天天操天天干天天射 | 久久精品国产99久久香蕉 | 天天撸夜夜操 |