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

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

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

    即使世界明天毀滅,我也要在今天種下我的葡萄樹。
    posts - 112, comments - 14, trackbacks - 0, articles - 11
    java.sql.SQLException: ORA-01000: maximum open cursors exceeded at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:120) at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:614) at oracle.jdbc.driver.OracleStatement.open(OracleStatement........
    ?

    Cause: A host language program attempted to open too many cursors. The initialization parameter OPEN_CURSORS determines the maximum number of cursors per user.

    Action: Modify the program to use fewer cursors. If this error occurs often, shut down Oracle, increase the value of OPEN_CURSORS, and then restart Oracle.

    ?
    ?
    關(guān)于cursor 的參數(shù)有這么幾個:
    SQL> show parameter cursor
    NAME???????????????????????????????? TYPE??????? VALUE
    ------------------------------------ ----------- ------------------------------
    cursor_sharing?????????????????????? string????? EXACT
    cursor_space_for_time??????????????? boolean???? FALSE
    open_cursors???????????????????????? integer???? 800
    session_cached_cursors?????????????? integer???? 0
    ?
    這里,cursor_sharing跟open_cursors的數(shù)量沒有關(guān)系。open_cursors的數(shù)量,它包括了oracle服務(wù)器端session_cached_cursors的數(shù)量,以及應(yīng)用服務(wù)器端cursor cache size的數(shù)量。
    ?
    關(guān)于session_cached_cursors這個參數(shù),可以看 汪海 寫的2篇文章:
    ?
    ?
    這個問題的根源,除了上面3個參數(shù),主要在于程序的問題,在itpub 上我們可以看到:
    ??
    很多朋友在Java開發(fā)中,使用Oracle數(shù)據(jù)庫的時候,經(jīng)常會碰到有ORA-01000: maximum open cursors exceeded.的錯誤。

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

    這樣的錯誤很容易出現(xiàn)在Java代碼中的主要原因是:Java代碼在執(zhí)行conn.createStatement()和conn.prepareStatement()的時候,實際上都是相當(dāng)與在數(shù)據(jù)庫中打開了一個cursor。尤其是,如果你的createStatement和prepareStatement是在一個循環(huán)里面的話,就會非常容易出現(xià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)不治本。實際上,代碼中的隱患并沒有解除。
    而且,絕大部分情況下,open_cursors只需要設(shè)置一個比較小的值,就足夠使用了,除非有非常特別的要求。
    ?

    如果你不使用連接池,那么就沒有什么問題,一旦Connection關(guān)閉,數(shù)據(jù)庫物理連接就被釋放,所有相關(guān)Java資源也可以被GC回收了。

    但是如果你使用連接池,那么請注意,Connection關(guān)閉并不是物理關(guān)閉,只是歸還連接池,所以PreparedStatement和ResultSet都被持有,并且實際占用相關(guān)的數(shù)據(jù)庫的游標(biāo)資源,在這種情況下,只要長期運行,往往就會報“游標(biāo)超出數(shù)據(jù)庫允許的最大值”的錯誤,導(dǎo)致程序無法正常訪問數(shù)據(jù)庫。


    ---


    這個關(guān)不關(guān)和使用不使用conn pool沒有關(guān)系,一般操作是會是這樣,線程從外界獲取一個conn,然后創(chuàng)建自己地stmt,rs,然后執(zhí)行邏輯操作,然后將conn返回給pool。 如果程序員忘記手動關(guān)地話。當(dāng)這個線程執(zhí)行完以后,stmt,rs都成垃圾,當(dāng)他們被垃圾搜集地時候,gc會替我們把它們給關(guān)閉地。這就是很多代碼沒有關(guān)閉,仍然正常運行。
    但是這樣會有一個潛在地問題。就是gc無法確定什么時候運行。如果free地內(nèi)存很多,很可能有些gc就不會被啟動,這樣stmt遲遲沒有被關(guān)閉,執(zhí)行一段時間會報錯。
    所以健壯地代碼應(yīng)該手工把rs,stmt都關(guān)閉


    ---


    Java連結(jié)Oracle常犯錯誤
    1。只懂 createStatement,不懂關(guān)閉statement

    2.。只懂 createStatement,不懂preparedStatement.

    3 。只懂在sql里用to_date,甚至直接用String,不懂用 setDate()

    ---

    我記得.我的程序中也出現(xiàn)過這種問題,
    主要原因是我get Connection 對象后,這個connectin沒有被進(jìn)行關(guān)閉,
    同時進(jìn)行出來的 preparedStatement 對象,不關(guān)閉也會出現(xiàn)這種問題,
    而且,推薦這些數(shù)據(jù)庫操作的變量盡量用局部變量,現(xiàn)用現(xiàn)取,隨時關(guān)閉,而且放在finally{}中進(jìn)行關(guān)閉,比較保險

    ---

    通常這樣的情形是你使用了超過DB設(shè)定同時可用的connection數(shù)量
    你可以試試看下列方式:
    1. 若你使用connection pool, 你可以將connection pool的max connection
    數(shù)量降低看看, 同時檢查有無歸還connection
    2. 若未使用conneciton pool, 你就該檢查一下, 你的connection在使用過後
    有沒有關(guān)閉囉

    另外一種情形是: 你的系統(tǒng)使用量真的很大, 所以同時150的DB connection
    session是不夠的, 你就需要調(diào)整Oracle DB囉

    通常的jdbc代碼:
    ...
    Statement stmt = null;
    ResultSet rs = null;
    try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery('select xx from yy');
    ...
    } catch (SQLExeption e) {
    e.printlStackTrace();
    } finally {
    if (stmt != null) {
    try {stmt.close();} catch (SQLException e) { }
    }
    }

    主站蜘蛛池模板: 亚洲精品美女久久久久99小说| 国产精品二区三区免费播放心| 国产aⅴ无码专区亚洲av| 美女被免费网站视频在线| 国产麻豆免费观看91| 亚洲国产精品无码久久| 午夜成年女人毛片免费观看| 亚洲AV成人影视在线观看| 国产一精品一AV一免费孕妇| 国产成人亚洲综合一区| 大学生a级毛片免费观看 | 四虎国产精品免费久久影院| 亚洲欧美在线x视频| 亚洲一区精品伊人久久伊人| 你懂得的在线观看免费视频| 亚洲成色999久久网站| 四虎在线最新永久免费| 亚洲国产区男人本色在线观看| 暖暖免费高清日本中文| 一级毛片大全免费播放下载| 亚洲AV日韩精品久久久久久久| 亚洲免费人成视频观看| 亚洲大码熟女在线观看| 久久伊人亚洲AV无码网站| 久久免费公开视频| 色偷偷亚洲女人天堂观看欧| 国产乱子伦片免费观看中字| 国产成人无码区免费内射一片色欲| 久久精品国产亚洲av麻豆小说| 天天摸夜夜摸成人免费视频| 国产黄在线观看免费观看不卡| 亚洲邪恶天堂影院在线观看| 日本免费v片一二三区| 国产午夜无码片免费| 亚洲午夜久久久精品电影院| 免费人成年激情视频在线观看| 色播在线永久免费视频网站| 亚洲色精品VR一区区三区| 久久亚洲色一区二区三区| 国产曰批免费视频播放免费s| 深夜A级毛片视频免费|