我试图找出在高流量站点中使用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&amp;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&amp;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的更多详细信息。

10-06 02:12