tomcat - Apache Commons DBCP 奇怪的行为

标签 tomcat tomcat6 connection-pooling apache-commons-dbcp high-traffic

我试图找出我们在使用 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"
    />

当我在该站点上运行一些测试流量时,我发现连接池大量丢失连接。大约一分钟后,我对 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&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 被认为已过时且不是生产级,建议使用 C3P0 而不是 DBCP。

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

似乎 Tomcat 7 附带了一个新的连接池作为一个新特性;它是 commons-dbcp 连接池的替代品。虽然 commons-dbcp 连接池适用于小型或低流量应用程序,但众所周知,它在高并发环境(想想多核/多 CPU)中会出现问题。

请引用 Connection pooling options with JDBC: DBCP vs C3P0有关 DBCP 与 C3P0 的更多详细信息。

关于tomcat - Apache Commons DBCP 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759174/

相关文章:

java - 如何在 servlet 响应中添加多个 "Set-Cookie" header ?

apache - 如何解决 Apache Tomcat 上的 Sweet32 漏洞?

Java RMI 连接池详细信息

java - 嵌入式Jetty 8和无XML的JNDI MySQL连接池的配置

tomcat - JDBC 连接池未在 Tomcat 中重新打开连接

eclipse - Eclipse 3.7 中缺少 Apache Tomcat

java.lang.异常 : No Certificate file specified or invalid file format

在 Ubuntu 12.04 上安装 tomcat6

java - 在 Tomcat 5.5 上运行应用程序

mysql - Oracle ADF - Tomcat 6.x - MySql 5.5 - java.lang.AbstractMethodError