<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.

    ?
    ?
    關于cursor 的參數有這么幾個:
    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的數量沒有關系。open_cursors的數量,它包括了oracle服務器端session_cached_cursors的數量,以及應用服務器端cursor cache size的數量。
    ?
    關于session_cached_cursors這個參數,可以看 汪海 寫的2篇文章:
    ?
    ?
    這個問題的根源,除了上面3個參數,主要在于程序的問題,在itpub 上我們可以看到:
    ??
    很多朋友在Java開發中,使用Oracle數據庫的時候,經常會碰到有ORA-01000: maximum open cursors exceeded.的錯誤。

    實際上,這個錯誤的原因,主要還是代碼問題引起的。
    ora-01000: maximum open cursors exceeded.
    表示已經達到一個進程打開的最大游標數。

    這樣的錯誤很容易出現在Java代碼中的主要原因是:Java代碼在執行conn.createStatement()和conn.prepareStatement()的時候,實際上都是相當與在數據庫中打開了一個cursor。尤其是,如果你的createStatement和prepareStatement是在一個循環里面的話,就會非常容易出現這個問題。因為游標一直在不停的打開,而且沒有關閉。

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

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

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

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


    ---


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


    ---


    Java連結Oracle常犯錯誤
    1。只懂 createStatement,不懂關閉statement

    2.。只懂 createStatement,不懂preparedStatement.

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

    ---

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

    ---

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

    另外一種情形是: 你的系統使用量真的很大, 所以同時150的DB connection
    session是不夠的, 你就需要調整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) { }
    }
    }

    主站蜘蛛池模板: 亚洲人成精品久久久久| 亚洲码一区二区三区| 波多野结衣免费一区视频 | 一区二区三区免费视频观看| 亚洲精品中文字幕无码蜜桃| 4455永久在线观免费看| 污网站在线免费观看| 久久亚洲精品成人777大小说| 青青草免费在线视频| 中文无码日韩欧免费视频| 亚洲国产综合自在线另类| 亚洲精品黄色视频在线观看免费资源 | 麻豆成人精品国产免费| 伊人免费在线观看高清版| 亚洲一区二区三区写真| 亚洲成av人片天堂网| 男女交性永久免费视频播放| a级成人免费毛片完整版| 亚洲精品无码中文久久字幕| 78成人精品电影在线播放日韩精品电影一区亚洲 | 美丽的姑娘免费观看在线播放 | 成人毛片免费观看| 日韩免费在线视频| 老司机亚洲精品影院在线观看 | 日本精品久久久久久久久免费| 亚洲福利视频导航| 亚洲av区一区二区三| 99视频在线精品免费观看6| 花蝴蝶免费视频在线观看高清版| 亚洲老熟女五十路老熟女bbw| 亚洲精品私拍国产福利在线| 免费一级毛片清高播放| 无码中文在线二区免费| 蜜桃视频在线观看免费视频网站WWW| 一级毛片a免费播放王色电影| 中文字幕精品三区无码亚洲| 亚洲黄色一级毛片| 久久久久亚洲精品成人网小说| 亚洲精品专区在线观看| 四虎永久在线精品视频免费观看| 在线观看视频免费完整版|