歲月如哥
          人生非夢(mèng)
          posts - 50,comments - 144,trackbacks - 0
          引用:
          a.   如果設(shè)為true則tomcat自動(dòng)檢查恢復(fù)重新利用,沒(méi)有正常關(guān)閉的Connection.(默認(rèn)是false)
            <parameter>
            <name>removeAbandoned</name>
            <value>true</value>
            </parameter>
          b.   設(shè)定連接在多少秒內(nèi)被認(rèn)為是放棄的連接,即可進(jìn)行恢復(fù)利用。
            <parameter>
            <name>removeAbandonedTimeout</name>
            <value>60</value>
            </parameter>
          c.   輸出回收的日志,可以詳細(xì)打印出異常從而發(fā)現(xiàn)是在那里發(fā)生了泄漏
            <parameter>
            <name>logAbandoned</name>
            <value>true</value>
            </parameter>
          實(shí)驗(yàn)環(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>
          使用如下代碼進(jìn)行實(shí)驗(yàn)(每一次不關(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();
          }

          當(dāng)該連續(xù)執(zhí)行5次之后,后臺(tái)就報(bào)連接池滿的錯(cuò):
          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ù)庫(kù)連接
          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
           
          得到類(lèi)似如下的五條記錄,即有5個(gè)連接沒(méi)有釋放
          引用:
          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í)行該代碼,后臺(tái)就報(bào)如下錯(cuò),提示哪里的代碼沒(méi)有關(guān)閉連接(已經(jīng)具體到那一行代碼獲取的連接沒(méi)有關(guān)閉,這個(gè)很重要!!!下面紅顏色標(biāo)注的異常點(diǎn)信息就是具體連接沒(méi)有釋放的代碼信息)
           
          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)
          如果時(shí)間超過(guò)removeAbandonedTimeout設(shè)置的時(shí)間,再直接使用上面的sql腳本查看數(shù)據(jù)庫(kù)連接發(fā)現(xiàn)已經(jīng)都被釋放了,并且如果再進(jìn)行其他數(shù)據(jù)庫(kù)操作已經(jīng)不報(bào)連接池滿的問(wèn)題。說(shuō)明過(guò)了60秒之后,tomcat會(huì)把那些它認(rèn)為沒(méi)有釋放的連接進(jìn)行釋放。

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

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

          FeedBack:
          # re: tomcat連接池的三個(gè)重要參數(shù)
          2008-09-08 09:34 | 隔葉黃鶯
          對(duì) Tomcat 性能應(yīng)該影響不大,不過(guò)正如樓主所說(shuō)的,最終還是應(yīng)該從代碼上解決連接池的及時(shí)釋放。這三個(gè)參數(shù)只是用來(lái)輔助錯(cuò)誤定位,臨時(shí)應(yīng)對(duì)問(wèn)題的。
          這三個(gè)參數(shù)應(yīng)該是 dbcp 連接池實(shí)現(xiàn)才有的吧。  回復(fù)  更多評(píng)論
            
          # re: tomcat連接池的三個(gè)重要參數(shù)
          2008-09-12 14:05 | 25767139aa@163.com
          理論上是可以,但是實(shí)際上,TOMCAT就算配置上面的一些參素也不一定就可以
          ,因?yàn)橐郧熬妥鲞^(guò)這樣的項(xiàng)目,服務(wù)器經(jīng)常掛掉,原因是連接池溢出,也就是連接沒(méi)有釋放,但是我們也象樓主樣配置了上面的參數(shù),也不起作用,
          只有去改程序!!!
            回復(fù)  更多評(píng)論
            
          # re: tomcat連接池的三個(gè)重要參數(shù)[未登錄](méi)
          2009-08-03 11:35 | 李強(qiáng)
          連接池就是管理連接對(duì)象集合  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 金坛市| 神池县| 玉屏| 蓝山县| 淳化县| 水城县| 顺平县| 内乡县| 邵武市| 内江市| 无锡市| 海阳市| 修文县| 綦江县| 嘉黎县| 肃北| 泽库县| 安顺市| 鲁甸县| 文昌市| 汉寿县| 枣阳市| 无锡市| 达日县| 永平县| 大方县| 天台县| 平利县| 湖北省| 开封县| 叶城县| 冕宁县| 平谷区| 嘉祥县| 连山| 石家庄市| 平塘县| 富民县| 理塘县| 卓尼县| 建宁县|