Apache Commons DBCP的奇怪行为

3
我正在解决一个与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&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个连接 - 所有这些连接几乎立即关闭。
我尝试切换到Apache Commons,将其添加到lib文件夹中并包含属性。
            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是否有什么严重的问题,以至于它甚至在最简单的情况下都不能正常工作?这一切是否有解释?


你找到解决方案了吗?我也有同样的问题。 - Jens
2个回答

0

DBCP被认为已经过时,对于系统负载较重(多线程)的情况,建议使用C3P0代替DBCP。

C3P0是一个易于使用的库,通过增加jdbc3规范和jdbc2可选扩展定义的功能,使传统的JDBC驱动程序“企业级就绪”。

似乎Tomcat 7带有一个新的连接池作为新功能;它是commons-dbcp连接池的替代品。虽然commons-dbcp连接池适用于小型或低流量应用程序,但在高并发环境(考虑多核/多CPU)中已知存在问题。

请参考JDBC连接池选项:DBCP vs C3P0以获取有关DBCP vs C3P0的更多详细信息。


0
你的问题源于maxIdle设置过低。将maxIdle设置为1意味着在任何给定时间内,池中最多只能有1个连接处于空闲状态。在高并发负载下,连接有时会以比借用速度更快的速度返回,导致池中短暂积累空闲连接。当maxIdle设置为1时,除第一个空闲连接外,其余所有连接都将在返回时关闭。将maxIdle保留为默认值(1.x为8)或将其设置为maxActive应该可以提高性能。

请参见https://commons.apache.org/proper/commons-dbcp/api-1.4/org/apache/commons/dbcp/BasicDataSource.html#maxIdle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接