<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) { }
    }
    }

    主站蜘蛛池模板: 黄视频在线观看免费| 亚洲入口无毒网址你懂的| 羞羞漫画在线成人漫画阅读免费| 美女视频黄a视频全免费| youjizz亚洲| 天堂在线免费观看中文版| 亚洲国产精品无码久久九九大片| 免费看a级黄色片| 久久精品国产亚洲AV未满十八| 日本视频免费在线| 美女视频黄视大全视频免费的| 全部免费毛片在线| 黄色网页在线免费观看| 亚洲国产综合专区在线电影| 18级成人毛片免费观看| 亚洲日日做天天做日日谢| 日韩免费在线观看| 成人嫩草影院免费观看| 亚洲av永久无码精品网站| 日本视频一区在线观看免费| 亚洲色少妇熟女11p| 亚洲男人的天堂一区二区| 久久青草国产免费观看| 亚洲三级在线播放| 日批日出水久久亚洲精品tv| 91在线免费观看| 亚洲日本视频在线观看| 四虎永久免费影院在线| 国产免费无码一区二区| 亚洲午夜电影在线观看| 亚洲av区一区二区三| 毛片在线播放免费观看| 亚洲一区二区三区丝袜| 精品国产亚洲男女在线线电影| 亚洲免费在线播放| 久久久久久亚洲av无码蜜芽 | 一个人免费观看视频www| 久久亚洲精品无码网站| 亚洲欧洲免费视频| 免费人成激情视频| 免费观看激色视频网站bd|