小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

BlogJava - 天道酬勤 - 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)

 加菲 2006-04-04

關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)

昨天在開發(fā)過程中,經(jīng)常碰到ORA-01000: maximum open cursors exceeded這個錯誤。一看報(bào)錯,知道是游標(biāo)超過最大數(shù)了,以前在做DB2開發(fā)的時候,也曾遇到過類似的問題。雖然解決了,但一直沒弄清楚,JDBC是如何和數(shù)據(jù)庫發(fā)生交互的?又是在什么時候打開數(shù)據(jù)庫游標(biāo)的?腦袋就跟漿糊一樣,說來真是慚愧啊

昨天google了一把,終于解開一點(diǎn)迷惑了。

下面的片斷轉(zhuǎn)載于www.

[TIP]關(guān)于Java開發(fā)中使用Oracle數(shù)據(jù)庫的一點(diǎn)注意事項(xiàng)(原創(chuàng))

很多朋友在Java開發(fā)中,使用Oracle數(shù)據(jù)庫的時候,經(jīng)常會碰到有ORA-01000: maximum open cursors exceeded.的錯誤。

實(shí)際上,這個錯誤的原因,主要還是代碼問題引起的。
ora-01000: maximum open cursors exceeded.
表示已經(jīng)達(dá)到一個進(jìn)程打開的最大游標(biāo)數(shù)。

這樣的錯誤很容易出現(xiàn)在Java代碼中的主要原因是:Java代碼在執(zhí)行conn.createStatement()和conn.prepareStatement()的時候,實(shí)際上都是相當(dāng)與在數(shù)據(jù)庫中打開了一個cursor。尤其是,如果你的createStatement和prepareStatement是在一個循環(huán)里面的話,就會非常容易出現(xiàn)這個問題。因?yàn)橛螛?biāo)一直在不停的打開,而且沒有關(guān)閉。

一般來說,我們在寫Java代碼的時候,createStatement和prepareStatement都應(yīng)該要放在循環(huán)外面,而且使用了這些Statment后,及時關(guān)閉。最好是在執(zhí)行了一次executeQuery、executeUpdate等之后,如果不需要使用結(jié)果集(ResultSet)的數(shù)據(jù),就馬上將Statment關(guān)閉。

對于出現(xiàn)ORA-01000錯誤這種情況,單純的加大open_cursors并不是好辦法,那只是治標(biāo)不治本。實(shí)際上,代碼中的隱患并沒有解除。
而且,絕大部分情況下,open_cursors只需要設(shè)置一個比較小的值,就足夠使用了,除非有非常特別的要求。

我昨天犯的錯誤就是把創(chuàng)建statement放到了循環(huán)之內(nèi),結(jié)果導(dǎo)致cursor猛增,到達(dá)了數(shù)據(jù)庫設(shè)置的最大數(shù)。
雖然解決了問題,也清楚了游標(biāo)是何時創(chuàng)建的,但還有幾個問題比較迷糊。
1、通過查詢,JDBC是將所有的查詢結(jié)果一次性放到ResultSet中,還是一次只放一定數(shù)目的記錄?例如,查詢結(jié)果為2000條數(shù)據(jù),JDBC是一次性將2000條數(shù)據(jù)放到結(jié)果集中,還是分批放置呢?

2、當(dāng)通過ResultSet.next(),移動結(jié)果集指針時,此時是否還與數(shù)據(jù)庫發(fā)生交互?

posted on 2005-01-27 10:15 候鳥南飛 閱讀(4092) 評論(9)  編輯 收藏 收藏至365Key

評論

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

連接和statement使用完畢之后應(yīng)該及時關(guān)閉,這個應(yīng)該是粉簡單的道理吧.
2005-01-27 10:53 | eamoi

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

鳥人
還沒回到阿?
2005-02-17 21:33 | 不至于

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   


2005-03-29 15:05 |

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

The article is great. I got the same error and keep scratching my head till I found your page. Keep it up!
2005-04-28 15:39 | San

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

繼續(xù)下去啊。這個問題應(yīng)該是一個比較典型的問題了吧,繼續(xù)討論阿
2005-05-10 18:27 | 芨芨草

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

pst.close();
rs.close();

只要及時關(guān)閉應(yīng)該就可以了吧?
2005-07-05 15:23 | plutohades

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

首先結(jié)果集resultset在你的java程序處。其中有個fetchsize設(shè)置,這個表示每次從數(shù)據(jù)庫處取多少條記錄到resultset.
2006-03-14 09:42 |

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

當(dāng)通過ResultSet.next(),移動結(jié)果集指針時,此時是否還與數(shù)據(jù)庫發(fā)生交互?

不發(fā)生交互,數(shù)據(jù)庫執(zhí)行完查詢后,已經(jīng)把查詢結(jié)果交給ResultSet了,以后的操作,和數(shù)據(jù)庫無關(guān)。
2006-03-15 10:26 | jing

# re: 關(guān)于ORACLE游標(biāo)的問題(ORA-01000: maximum open cursors exceeded)  回復(fù)   

交互,如果1個查詢有10000條記錄,resultset中只有fetchsize條,當(dāng)next時還會在一定時機(jī)去交互
2006-03-17 10:44 |

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多