首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache Commons DBCP奇怪的行为

Apache Commons DBCP奇怪的行为
EN

Stack Overflow用户
提问于 2013-07-20 13:54:17
回答 2查看 2K关注 0票数 3

我正在尝试解决一个问题,我们在一个高流量的网站上使用Tomcat6.0.37和MySQL 5.5作为掩护。测试负载是到Tomcat的200个并发连接-所有连接到相同的URL,并且所有连接都命中数据库。

为了实现连接池,我们使用了嵌入式tomcat-dbcp包。下面是我们使用的资源配置:

代码语言:javascript
复制
    <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文件夹并包含属性

代码语言:javascript
复制
            factory="org.apache.commons.dbcp.BasicDataSourceFactory"

在我的配置中,但它给了我完全相同的结果。

我尝试切换到C3P0和BoneCP,它实际上工作得很好,我看到最多有30个连接被保持-在MySQL上没有新的或掉线的连接

我还尝试使用Apache Tomcat 7中的连接池(只是为了使用它),它在以下配置下也工作得很好:

代码语言:javascript
复制
    <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是否真的有什么问题,即使在最简单的情况下也不能工作?对这一切有什么解释吗?

EN

回答 2

Stack Overflow用户

发布于 2015-09-10 17:23:04

对于负载过重的系统(多线程),DBCP被认为是过时的且不是生产级的,建议使用C3P0而不是DBCP。

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

看起来Tomcat7带来了一个新的连接池作为一个新特性;它是commons-dbcp连接池的替代品。虽然commons-dbcp连接池适用于小流量或低流量的应用程序,但众所周知,它在高并发环境中存在问题(请考虑多核/多cpu)。

有关DBCP与C3P0的更多详细信息,请参阅Connection pooling options with JDBC: DBCP vs C3P0

票数 0
EN

Stack Overflow用户

发布于 2016-05-15 23:21:38

问题的根源是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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17759174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档