<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.   設定連接在多少秒內(nèi)被認為是放棄的連接,即可進行恢復利用。
      <parameter>
      <name>removeAbandonedTimeout</name>
      <value>60</value>
      </parameter>
    c.   輸出回收的日志,可以詳細打印出異常從而發(fā)現(xiàn)是在那里發(fā)生了泄漏
      <parameter>
      <name>logAbandoned</name>
      <value>true</value>
      </parameter>
    實驗環(huán)境,tomcat配置連接池,最大連接數(shù)為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();
    }

    當該連續(xù)執(zhí)行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
    根據(jù)如下腳本查數(shù)據(jù)連接
    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.
    如果繼續(xù)執(zhí)行該代碼,后臺就報如下錯,提示哪里的代碼沒有關閉連接(已經(jīng)具體到那一行代碼獲取的連接沒有關閉,這個很重要!!!下面紅顏色標注的異常點信息就是具體連接沒有釋放的代碼信息)
     
    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腳本查看數(shù)據(jù)庫連接發(fā)現(xiàn)已經(jīng)都被釋放了,并且如果再進行其他數(shù)據(jù)庫操作已經(jīng)不報連接池滿的問題。說明過了60秒之后,tomcat會把那些它認為沒有釋放的連接進行釋放。

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

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

    FeedBack:
    # re: tomcat連接池的三個重要參數(shù)
    2008-09-08 09:34 | 隔葉黃鶯
    對 Tomcat 性能應該影響不大,不過正如樓主所說的,最終還是應該從代碼上解決連接池的及時釋放。這三個參數(shù)只是用來輔助錯誤定位,臨時應對問題的。
    這三個參數(shù)應該是 dbcp 連接池實現(xiàn)才有的吧。  回復  更多評論
      
    # re: tomcat連接池的三個重要參數(shù)
    2008-09-12 14:05 | 25767139aa@163.com
    理論上是可以,但是實際上,TOMCAT就算配置上面的一些參素也不一定就可以
    ,因為以前就做過這樣的項目,服務器經(jīng)常掛掉,原因是連接池溢出,也就是連接沒有釋放,但是我們也象樓主樣配置了上面的參數(shù),也不起作用,
    只有去改程序!??!
      回復  更多評論
      
    # re: tomcat連接池的三個重要參數(shù)[未登錄]
    2009-08-03 11:35 | 李強
    連接池就是管理連接對象集合  回復  更多評論
      
    主站蜘蛛池模板: 中文字幕av无码不卡免费| 香蕉蕉亚亚洲aav综合| 亚洲人成精品久久久久| 亚洲国产精品日韩专区AV| 亚洲国产成人精品女人久久久 | 久久久久久国产a免费观看不卡| 四虎国产精品永久免费网址 | 永久中文字幕免费视频网站| 成人免费a级毛片无码网站入口| 国产精品成人免费一区二区| 男男AV纯肉无码免费播放无码| 亚洲成av人在片观看| 久久亚洲精品成人av无码网站 | 亚洲色偷偷综合亚洲av78| 黄床大片免费30分钟国产精品| 91黑丝国产线观看免费| 亚洲AV无码一区二三区| 亚洲精品国产成人| 男人和女人高潮免费网站 | 久久成人a毛片免费观看网站| 在线免费观看一区二区三区| 亚洲av无码乱码国产精品| 国产亚洲欧美日韩亚洲中文色| 日韩在线永久免费播放| 国产片AV片永久免费观看| 美女被免费喷白浆视频| 国产亚洲情侣一区二区无| 中文字幕在线观看亚洲日韩| 四虎国产精品成人免费久久| 91在线手机精品免费观看| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 在线观看亚洲AV每日更新无码| 日韩电影免费在线观看中文字幕| 成人永久免费高清| 亚洲伊人色一综合网| 黄色毛片免费在线观看| 一级成人a毛片免费播放| 亚洲av日韩片在线观看| 亚洲www77777| 182tv免费视视频线路一二三| 中文字幕亚洲日韩无线码|