<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    天道酬勤

    沒(méi)有成功,說(shuō)明努力還不夠!
    隨筆 - 2, 文章 - 0, 評(píng)論 - 29, 引用 - 0
    數(shù)據(jù)加載中……

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

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

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

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

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

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

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

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

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

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

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

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

    posted on 2005-01-27 10:15 候鳥(niǎo)南飛 閱讀(52591) 評(píng)論(27)  編輯  收藏

    評(píng)論

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

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

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    鳥(niǎo)人
    還沒(méi)回到阿?
    2005-02-17 21:33 | 不至于

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   


    2005-03-29 15:05 |

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    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)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

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

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

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

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

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

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

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

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

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

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

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

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    白是對(duì)的。
    2006-05-08 09:27 | 阿黑

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    非常感謝!
    2006-05-12 15:00 | 感謝

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    暈。。。。。。。。。
    2006-05-18 15:50 | 順哥

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    一搜索這個(gè)問(wèn)題竟然到了你的blog,真是冤孽啊。。:)
    2006-05-18 15:51 | 順哥

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    不是將查詢結(jié)果一次性放到ResultSet中, 而是分批放入ResultSet中,一般情況下是每次10條記錄.
    當(dāng)通過(guò)ResultSet.next(),移動(dòng)結(jié)果集指針時(shí),此時(shí)還會(huì)與數(shù)據(jù)庫(kù)發(fā)生交互.

    導(dǎo)致maximum open cursors exceeded這個(gè)問(wèn)題一般是代碼本身的問(wèn)題.
    比如執(zhí)行一個(gè)查詢沒(méi)有關(guān)閉游標(biāo),或是在存儲(chǔ)過(guò)程中打開(kāi)了游標(biāo)而沒(méi)有關(guān)閉.
    特別是出現(xiàn)異常情況是沒(méi)有關(guān)閉游標(biāo).嚴(yán)重時(shí)會(huì)導(dǎo)致系統(tǒng)崩掉
    2006-06-01 03:58 | sheen

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    我也是同樣的問(wèn)題,但我開(kāi)發(fā)語(yǔ)言是用DELPHI,使用組件是ADOQUERY,游標(biāo)超過(guò)最大數(shù)困擾我好久了,如果有誰(shuí)知道,請(qǐng)告之jxprovince@mail.china.com
    2006-06-18 17:42 | JXPROVINCE

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    啊~!~`我剛也犯了這種錯(cuò)誤!!``看到這里的貼子,小妹又明白了:"哦!``原來(lái)conn.createStatement()和conn.prepareStatement()的時(shí)候?qū)嶋H上都是相當(dāng)與在數(shù)據(jù)庫(kù)中打開(kāi)了一個(gè)cursor。!!"明白了這點(diǎn)過(guò)后,我就在循環(huán)里新建一個(gè)prepareStatement對(duì)象,操作完一次,成功過(guò)后就馬上關(guān)掉!這樣,循環(huán)里每次一個(gè)insert都新new 一個(gè)prepareStatement 操作成功完成之后再馬上關(guān)閉.嘎嘎.~這樣,cursor就不會(huì)溢出拉.
    2007-01-11 09:55 | 子圓

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    我遇到的就是這個(gè)問(wèn)題,看了你的文章終于明白了
    2007-03-07 18:20 | vingle

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    有時(shí)候出于性能方面的考慮,多個(gè)用戶使用一個(gè)數(shù)據(jù)庫(kù)連接,這時(shí)一定要及時(shí)關(guān)閉cursor,否則就會(huì)報(bào)這個(gè)錯(cuò)。
    2007-06-15 11:15 | fenix

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

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


    不與數(shù)據(jù)庫(kù)交互,此時(shí)數(shù)據(jù)集拿到一個(gè)collection中,ResultSet就是一個(gè)collectin是實(shí)現(xiàn)
    2007-07-11 18:00 | cshbl@hotmail.com

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    3ks
    2007-10-11 18:06 | zhangyangbin

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    謝謝
    犯了跟你一樣的錯(cuò)
    2008-09-01 10:03 | nijj

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    你是對(duì)的...
    2008-12-16 18:47 | 豬頭

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)[未登錄](méi)  回復(fù)  更多評(píng)論   

    我的問(wèn)題還是這個(gè),但是估計(jì)你沒(méi)有回答到點(diǎn)子上。
    我在開(kāi)發(fā)過(guò)程中,本身用Hibernate3應(yīng)該完全不用我們干預(yù)Session的工作吧,要不還要它作甚?
    我的測(cè)試系統(tǒng)在MYSQL數(shù)據(jù)庫(kù)上從來(lái)不會(huì)出現(xiàn)這個(gè)問(wèn)題,但是切換到生產(chǎn)系統(tǒng),除了數(shù)據(jù)庫(kù)URL和方言配置改成ORACLE外,其他全部不變,但是它就是出了這個(gè)ORA-01000,這不是逼著我不用這個(gè)破Hibernate嘛
    2009-06-02 08:10 | 明明

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)[未登錄](méi)  回復(fù)  更多評(píng)論   

    好像是這樣的,出現(xiàn)了同樣的報(bào)錯(cuò),看程序也是在循環(huán)里面prepareStatement
    2009-08-10 10:41 | 111

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    ResultSet不是與數(shù)據(jù)庫(kù)的一個(gè)映射關(guān)系嗎,rs.close()之后,ResultSet.next()不行吧....
    2010-08-12 11:40 | 任李菲

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    剛好碰到了這個(gè)問(wèn)題,謝了、、、
    2011-02-28 16:02 | 經(jīng)

    # re: 關(guān)于ORACLE游標(biāo)的問(wèn)題(ORA-01000: maximum open cursors exceeded)  回復(fù)  更多評(píng)論   

    只要不循環(huán)或者過(guò)多的創(chuàng)建statement就行了,一般寫(xiě)循環(huán)邏輯會(huì)出現(xiàn)這類問(wèn)題。
    有些人提到j(luò)pa類的框架,這種情況如果出現(xiàn)不是框架的問(wèn)題,而是使用方法不得當(dāng)造成的,statement的類型選擇或者sql的結(jié)構(gòu)優(yōu)化不對(duì),導(dǎo)致statement創(chuàng)建過(guò)多。

    next是否跟數(shù)據(jù)庫(kù)交互,取決于你的fetchsize
    2011-03-16 17:25 | 王志猛

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一二三四免费观看在线电影 | 亚洲成A人片在线观看WWW| 最近的2019免费中文字幕| 亚洲午夜精品在线| 国产在线不卡免费播放| 免费观看91视频| 亚洲精品9999久久久久无码| 亚洲日韩欧洲无码av夜夜摸| 永久免费av无码网站韩国毛片| 在线播放免费人成视频网站| 久久av无码专区亚洲av桃花岛| 哒哒哒免费视频观看在线www| 久久综合国产乱子伦精品免费| 亚洲欧美日韩中文二区| 亚洲国产精品乱码一区二区 | 亚洲成年看片在线观看| 在线人成精品免费视频| 成年大片免费高清在线看黄| 亚洲视频国产视频| 亚洲综合色区在线观看| 国产成人A在线观看视频免费| a级午夜毛片免费一区二区| 亚洲av成本人无码网站| 中文字幕亚洲免费无线观看日本| 一级毛片直播亚洲| 免费观看成人毛片a片2008| 久久免费美女视频| 草久免费在线观看网站| 亚洲人成电影网站色| 久久综合亚洲色HEZYO社区| 国产亚洲日韩一区二区三区| 青青草国产免费久久久91| 中国xxxxx高清免费看视频| 久久国产精品免费一区| 国产精品亚洲а∨无码播放不卡 | 国产精品亚洲综合一区| 日韩成人免费视频播放| 一二三四免费观看在线电影| 亚洲精品视频在线免费| 99爱视频99爱在线观看免费| a级毛片无码免费真人久久|