我试图找出在高流量站点中使用Tomcat 6.0.37和MySQL 5.5作为封面的问题。测试负载是与Tomcat的200个并发连接-所有到同一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"
/>
当我在该站点上运行一些测试流量时,我看到连接池大量释放了连接。大约一分钟后,我已经尝试了超过10000次与MySQL的连接,并且该池从未容纳超过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是否确实存在某些问题,即使在最简单的情况下,它也不起作用?这一切都有解释吗?
最佳答案
对于DBCP被认为过时且不是生产级产品(对于多负载的系统)(多线程),建议在DBCP上使用C3P0。
C3P0是一个易于使用的库,通过使用jdbc3规范和jdbc2的可选扩展定义的功能来扩展传统JDBC驱动程序,从而使其“企业就绪”。
似乎Tomcat 7附带了一个新的连接池作为一项新功能。它替代了commons-dbcp连接池。虽然commons-dbcp连接池在小型或低流量应用程序中可以正常工作,但是众所周知,它在高并发环境中存在问题(请考虑多核/多CPU)。
请参阅
Connection pooling options with JDBC: DBCP vs C3P0有关DBCP与C3P0的更多详细信息。