歲月如哥
          人生非夢
          posts - 50,comments - 144,trackbacks - 0
          引用:
          a.   如果設(shè)為true則tomcat自動檢查恢復(fù)重新利用,沒有正常關(guān)閉的Connection.(默認是false)
            <parameter>
            <name>removeAbandoned</name>
            <value>true</value>
            </parameter>
          b.   設(shè)定連接在多少秒內(nèi)被認為是放棄的連接,即可進行恢復(fù)利用。
            <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>
          使用如下代碼進行實驗(每一次不關(guān)閉連接):
          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í)行該代碼,后臺就報如下錯,提示哪里的代碼沒有關(guān)閉連接(已經(jīng)具體到那一行代碼獲取的連接沒有關(guān)閉,這個很重要!!!下面紅顏色標注的異常點信息就是具體連接沒有釋放的代碼信息)
           
          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設(shè)置的時間,再直接使用上面的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)境中試試然后看看后臺日志,一是想得到具體是哪些地方的代碼沒有釋放,二是如果設(shè)置removeAbandonedTimeout參數(shù),可以避免連接沒有釋放的問題。當然個人認為最終部署環(huán)境是不需要該參數(shù)的,在程序中把連接釋放才是解決問題的最根本辦法,另外目前還不知道這三個參數(shù)會對tomcat性能造成什么影響,應(yīng)該不大。
          posted on 2008-09-07 09:43 歲月如歌 閱讀(6795) 評論(3)  編輯  收藏 所屬分類: java

          FeedBack:
          # re: tomcat連接池的三個重要參數(shù)
          2008-09-08 09:34 | 隔葉黃鶯
          對 Tomcat 性能應(yīng)該影響不大,不過正如樓主所說的,最終還是應(yīng)該從代碼上解決連接池的及時釋放。這三個參數(shù)只是用來輔助錯誤定位,臨時應(yīng)對問題的。
          這三個參數(shù)應(yīng)該是 dbcp 連接池實現(xiàn)才有的吧。  回復(fù)  更多評論
            
          # re: tomcat連接池的三個重要參數(shù)
          2008-09-12 14:05 | 25767139aa@163.com
          理論上是可以,但是實際上,TOMCAT就算配置上面的一些參素也不一定就可以
          ,因為以前就做過這樣的項目,服務(wù)器經(jīng)常掛掉,原因是連接池溢出,也就是連接沒有釋放,但是我們也象樓主樣配置了上面的參數(shù),也不起作用,
          只有去改程序!!!
            回復(fù)  更多評論
            
          # re: tomcat連接池的三個重要參數(shù)[未登錄]
          2009-08-03 11:35 | 李強
          連接池就是管理連接對象集合  回復(fù)  更多評論
            
          主站蜘蛛池模板: 旌德县| 鸡东县| 大方县| 保山市| 镇康县| 永泰县| 罗山县| 隆子县| 泗水县| 卓尼县| 平泉县| 余姚市| 阿拉尔市| 贵溪市| 龙游县| 健康| 新和县| 汶川县| 调兵山市| 青阳县| 策勒县| 高雄市| 黄石市| 满洲里市| 尼木县| 隆子县| 扬州市| 大名县| 宁远县| 绥滨县| 九龙县| 靖州| 蓬莱市| 开原市| 牟定县| 镇巴县| 盐山县| 北辰区| 南昌县| 祁东县| 衡山县|