引用:
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