【发布时间】:2015-02-26 21:41:32
【问题描述】:
进一步的问题是:为什么 com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable() 会消耗如此多的执行时间?还有 - 如何解决这个问题?
现在让我给你详细说明...
背景: 我有 Spring MVC java web 应用程序,它使用 SpringJDBC 进行数据访问。数据源配置如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.databaseurl}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="testConnectionOnCheckout" value="${c3po.testConnectionOnCheckout}" />
<property name="minPoolSize" value="${c3po.minPoolSize}" />
<property name="maxPoolSize" value="${c3po.maxPoolSize}" />
<property name="checkoutTimeout" value="${c3po.checkoutTimeout}" />
<property name="maxStatementsPerConnection" value="${c3po.maxStatementsPerConnection}" />
</bean>
相关属性:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.databaseurl=jdbc:mysql://localhost:3306/timesheet?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=somepassword
c3po.testConnectionOnCheckout=true
c3po.minPoolSize=5
c3po.maxPoolSize=200
c3po.checkoutTimeout=30000
c3po.maxStatementsPerConnection=50
当前意图: 准备公共可用性申请。所以我创建了一个非常简单的 JMeter 测试计划,它使用 500 个并发线程一次又一次地简单地打开应用程序的索引页面。
问题: 是不是我看到性能非常差,每秒大约 140 个请求,平均请求时间为 1700 毫秒,这是完全不可接受的。 请注意,在正常情况下没有负载测试,这样的请求大约需要 6 毫秒。 所以我做了什么 - 我运行了 jvisualvm,并进行了分析。 看起来它是消耗最多执行时间的 com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable() 。
问题: 为什么 com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable() 会消耗如此多的执行时间?还有 - 如何解决这个问题?
注意 1:当然我正在考虑添加更多缓存逻辑以避免调用数据库,但现在我对 c3po 和 mysql 优化更感兴趣。
注意 2:我运行的是 Windows 7 x64,它不是生产环境(它将是 CentOS),但仍然拥有顶级 i7 英特尔处理器和 SSD 磁盘,我期望更高的性能 =)
【问题讨论】:
-
不要使用 C3P0 :)。我会推荐HikariCP 我有更好的经验。此外,您的池畔没有意义,太大的池会影响您的表现,nice read here。接下来在不同的硬件和操作系统上运行测试,就像在生产中一样,恕我直言,这是一个无用的练习,因为操作系统可能会产生相当大的影响。
-
感谢您的建议。我刚试过。嗯......显然它显示了更好的性能!但是应用程序现在没有响应来自浏览器的请求 =) 不知道为什么,首先猜测 - tomcat 已经死了 =)
-
您确定它没有回答还是您的测试可能有缺陷?正常的申请能用吗?
-
是的,Firefox 显示空白页。我认为这与测试环境有关,事实上我在运行 tomcat 的同一台机器上运行 Jmeter。 Jmeter说“连接关闭”,可能与操作系统的限制有关。
标签: java mysql spring c3p0 spring-jdbc