我正在尝试解决一个问题,我们在一个高流量的网站上使用Tomcat6.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个-所有这些连接几乎都立即关闭。
我尝试切换到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&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是否真的有什么问题,即使在最简单的情况下也不能工作?对这一切有什么解释吗?
发布于 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。
发布于 2016-05-15 23:21:38
问题的根源是maxIdle设置过低。将maxIdle设置为1意味着在给定时间不能有超过1个连接在池中处于空闲状态。在高并发负载下,有时会以比借用更快的速度返回连接,从而导致池中的空闲连接瞬间累积。当maxIdle设置为1时,除第一个空闲连接外的所有连接都将在返回时关闭。将maxIdle保留为默认值(1.x为8)或将其设置为等于maxActive都可以提高您的性能。
https://stackoverflow.com/questions/17759174
复制相似问题