我們最近更改爲我們的服務器上的CMS垃圾收集器(XX:+UseConcMarkSweepGC
),它在測試中正常工作。當我們去到生產,事情最初的幾個小時內確定,但後來我們突然開始看到可怕的:當使用CMS GC時,Tomcat 6連接池變得古怪
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection,
pool error Timeout waiting for idle object
我們已經看到這些消息時,該數據庫是物理狀態爲關閉或重倉,但這WASN這次是這個案子。所以我開始想知道最近的GC變化可能是罪魁禍首。
我不明白的是爲什麼我們之前沒有見過這個。將GC更改爲併發標記掃描會改變某些事情(可能是終結器),從而暴露出此配置的問題?
我context.xml
PARAMS是這個樣子:
<Resource name="jdbc/DB" auth="Container" type="javax.sql.DataSource"
maxActive="64" maxIdle="60" maxWait="10000"
defaultAutoCommit="false"
我讀this link和開始懷疑這是難以置信的天真參數。根據我的理解,超過60個連接,我們將開始打開和關閉連接,而不會將它們返回到池中。但是我不知道這個和我們的GC變化之間是否有聯繫。
我們使用Tomcat 6.0.29和MySQL 5.1.45(5.1.12 JDBC連接器)。