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

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

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

    歲月如哥
    人生非夢
    posts - 50,comments - 144,trackbacks - 0
    引用:
    a.   如果設為true則tomcat自動檢查恢復重新利用,沒有正常關閉的Connection.(默認是false)
      <parameter>
      <name>removeAbandoned</name>
      <value>true</value>
      </parameter>
    b.   設定連接在多少秒內被認為是放棄的連接,即可進行恢復利用。
      <parameter>
      <name>removeAbandonedTimeout</name>
      <value>60</value>
      </parameter>
    c.   輸出回收的日志,可以詳細打印出異常從而發現是在那里發生了泄漏
      <parameter>
      <name>logAbandoned</name>
      <value>true</value>
      </parameter>
    實驗環境,tomcat配置連接池,最大連接數為5.
    代碼如下:
     
    <parameter>
                    
    <name>maxActive</name>
                    
    <value>5</value>             
                
    </parameter>
                
    <parameter>
                    
    <name>maxIdle</name>
                    
    <value>1</value>              
                
    </parameter>
                
    <parameter>
                    
    <name>maxWait</name>
                    
    <value>20000</value>          
                
    </parameter>
                
    <parameter>
                    
    <name>removeAbandoned</name>
                    
    <value>true</value>
                
    </parameter>
                
    <parameter>
                     
    <name>removeAbandonedTimeout</name>
                     
    <value>60</value>
                
    </parameter>
                
    <parameter>
                     
    <name>logAbandoned</name>
                     
    <value>true</value>
                
    </parameter>
    使用如下代碼進行實驗(每一次不關閉連接):
    try {
        Connection con 
    = getJdbcDAO().getDataSource().getConnection();
        ResultSet rs 
    = con.createStatement().executeQuery("select * from K_MS..B_MSPBXX");
        
    while (rs.next()) {
            System.out.println(rs.getString(
    1));
        }
    catch (SQLException e) {
         e.printStackTrace();
    }

    當該連續執行5次之后,后臺就報連接池滿的錯:
    2008-09-06 14:31:02,471 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 0, SQLState: null
    2008-09-06 14:31:02,471 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot get a connection, pool exhausted
    2008-09-06 14:31:02,580 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 0, SQLState: null
    2008-09-06 14:31:02,580 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot get a connection, pool exhausted
    根據如下腳本查數據連接
    declare cur_spid cursor 
    for
    select spid from sysprocesses where ipaddr='172.16.16.145' and program_name <> 'SQL_Advantage'
    go
    declare @spid Integer
    open  cur_spid
    fetch cur_spid into @spid 
    while @@sqlstatus=0
    begin
            
    print '%1!' , @spid
      
    dbcc traceon(3604)
      
    dbcc sqltext(@spid )
      
    fetch cur_spid into @spid 
    end
    close cur_spid
     
    得到類似如下的五條記錄,即有5個連接沒有釋放
    引用:
    95
    DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
    SQL Text: select * from K_MS..B_MSPBXX
    DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
    如果繼續執行該代碼,后臺就報如下錯,提示哪里的代碼沒有關閉連接(已經具體到那一行代碼獲取的連接沒有關閉,這個很重要!!!下面紅顏色標注的異常點信息就是具體連接沒有釋放的代碼信息)
     
    DBCP object created 2008-09-06 14:27:32 by the following code was never closed:
    java.lang.Exception
            at org.apache.commons.dbcp.AbandonedTrace.init(AbandonedTrace.java:96)
            at org.apache.commons.dbcp.AbandonedTrace.<init>(AbandonedTrace.java:79)
            at org.apache.commons.dbcp.DelegatingResultSet.<init>(DelegatingResultSet.java:71)
            at org.apache.commons.dbcp.DelegatingResultSet.wrapResultSet(DelegatingResultSet.java:80)
            at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:205)
            at com.thunisoft.fy.spxt.SpxtBaseLogic.createPbxx(SpxtBaseLogic.java:5772)
    如果時間超過removeAbandonedTimeout設置的時間,再直接使用上面的sql腳本查看數據庫連接發現已經都被釋放了,并且如果再進行其他數據庫操作已經不報連接池滿的問題。說明過了60秒之后,tomcat會把那些它認為沒有釋放的連接進行釋放。

        然后同樣的java代碼,把tomcat連接池的那三個參數去掉之后,執行5次之后也報連接池滿,但是再次執行就不能獲取新的連接,并且后臺的日志都是連接池滿的信息,而沒有具體那一行代碼的連接沒有釋放的異常信息。

        因為生產環境還是出現連接池滿的問題(基本上兩天報一次),準備把這三個參數放到實際環境中試試然后看看后臺日志,一是想得到具體是哪些地方的代碼沒有釋放,二是如果設置removeAbandonedTimeout參數,可以避免連接沒有釋放的問題。當然個人認為最終部署環境是不需要該參數的,在程序中把連接釋放才是解決問題的最根本辦法,另外目前還不知道這三個參數會對tomcat性能造成什么影響,應該不大。
    posted on 2008-09-07 09:43 歲月如歌 閱讀(6784) 評論(3)  編輯  收藏 所屬分類: java

    FeedBack:
    # re: tomcat連接池的三個重要參數
    2008-09-08 09:34 | 隔葉黃鶯
    對 Tomcat 性能應該影響不大,不過正如樓主所說的,最終還是應該從代碼上解決連接池的及時釋放。這三個參數只是用來輔助錯誤定位,臨時應對問題的。
    這三個參數應該是 dbcp 連接池實現才有的吧。  回復  更多評論
      
    # re: tomcat連接池的三個重要參數
    2008-09-12 14:05 | 25767139aa@163.com
    理論上是可以,但是實際上,TOMCAT就算配置上面的一些參素也不一定就可以
    ,因為以前就做過這樣的項目,服務器經常掛掉,原因是連接池溢出,也就是連接沒有釋放,但是我們也象樓主樣配置了上面的參數,也不起作用,
    只有去改程序!!!
      回復  更多評論
      
    # re: tomcat連接池的三個重要參數[未登錄]
    2009-08-03 11:35 | 李強
    連接池就是管理連接對象集合  回復  更多評論
      
    主站蜘蛛池模板: a级男女仿爱免费视频| 最近2018中文字幕免费视频| 久久国产精品亚洲一区二区| 114级毛片免费观看| 久久精品国产亚洲AV| 亚洲av无码成h人动漫无遮挡| 中国在线观看免费高清完整版| 黄页网址在线免费观看| 亚洲综合激情另类小说区| 免费国产成人午夜电影| 久久永久免费人妻精品下载| 亚洲Aⅴ在线无码播放毛片一线天| 国产亚洲一区二区在线观看| 99视频在线精品免费观看6| 两性色午夜视频免费播放| 亚洲成年网站在线观看| 亚洲AV无码一区二区三区DV| 国产乱子伦精品免费无码专区 | 美女视频黄.免费网址 | 一日本道a高清免费播放| 亚洲国产美女视频| 亚洲中文字幕无码久久综合网| 免费阿v网站在线观看g| 最近国语视频在线观看免费播放| 亚洲欧美乱色情图片| 亚洲国产老鸭窝一区二区三区| 亚洲Aⅴ无码一区二区二三区软件| 91频在线观看免费大全| 99精品免费视频| 阿v视频免费在线观看| 亚洲中文无码亚洲人成影院| 亚洲高清在线视频| 成人亚洲性情网站WWW在线观看| 免费无码又爽又刺激高潮的视频| 中文字幕视频免费| 国产午夜无码精品免费看| 免费人成动漫在线播放r18| 亚洲人成人网站18禁| 亚洲videos| 亚洲成a人片在线观看中文!!! | 麻豆91免费视频|