我试图找出我们在一个高流量站点中使用 Tomcat 6.0.37 和 MySQL 5.5 的问题。测试负载是 200 个与 Tomcat 的并发连接——所有连接都指向同一个 URL,并且都访问数据库。
为了进行连接池,我们使用嵌入式 tomcat-dbcp 包。这是我们使用的资源配置:
<Resource name="jdbc/appDataSource" auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/myapp?autoReconnect=true&characterEncoding=UTF-8"
username="root"
password="*****"
testOnBorrow="true"
maxWait="5000"
maxIdle="1"
maxActive="30"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
logAbandoned="true"
removeAbandoned="true"
removeAbandonedTimeout="60"
/>
当我在该站点上运行一些测试流量时,我发现连接池大量丢失了连接。大约一分钟后,我对 MySQL 进行了超过 10000 次连接尝试,并且池中的连接从未超过 20 个 - 所有连接几乎都立即关闭。
我尝试通过将其添加到 lib 文件夹并包含属性来切换到 Apache Commons
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
在我的配置中,但它给了我完全相同的结果。
我尝试切换到 C3P0 和 BoneCP,这实际上工作得很好,我看到最多 30 个连接被保持 - 在 MySQL 上没有新的或丢弃的连接
我也尝试过使用 Apache Tomcat 7 的连接池(只是为了它),它在以下配置中也能很好地工作:
<Resource name="jdbc/appDataSource" auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/myapp?autoReconnect=true&characterEncoding=UTF-8"
username="root"
password="******"
maxIdle="1"
maxActive="30"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
logAbandoned="true"
removeAbandoned="true"
removeAbandonedTimeout="60"
/>
我想知道 Apache Commons DBCP 是否真的有问题,即使在最简单的情况下也无法正常工作?这一切有解释吗?