在DBCP中的连接泄漏和死锁问题之后,我们决定用Tomcat JDBC-pool替换它。当然,迁移非常简单。
但在将其部署到生产环境后,我注意到,运行两个Tomcat的服务器上的负载从4-4.5增加到5.5。我们什么也没做,除了换赌注。此外,使用JMeter测量的性能下降了约5%。
我花了一些时间来调整池参数,但没有明显的效果。我在下面粘贴了我当前的配置(来自server.xml中的<GlobalNamingResources> ):
<Resource name="jdbc/xxxxxx"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
initialSize="10"
maxActive="100"
minIdle="10"
maxIdle="50"
maxWait="10000"
testOnBorrow="true"
testOnReturn="false"
testOnConnect="false"
testWhileIdle="false"
validationQuery="SELECT 1 from dual"
validationInterval="30000"
suspectTimeout="60"
timeBetweenEvictionRunsMillis="30000"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
abandonWhenPercentageFull="50"
minEvictableIdleTimeMillis="60000"
jmxEnabled="true"
username="xxxxx"
password="xxxxx"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:oci:xxxxx"/>FairQueue和PoolSweeperEnabled为真
在Spring applicationContext-jdbc.xml中,我只有:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="resourceRef">
<value>true</value>
</property>
<property name="jndiName">
<value>java:comp/env/jdbc/PortalDB</value>
</property>
</bean>我做错了什么?我想,开箱即用的JDBC_pool应该比DBCP更快。
发布于 2014-02-11 04:35:49
您的设置和调整看起来是正确的。您的负载增加可能是服务器同时处理更多并发请求的结果。DBCP可能已阻止服务器承担此负载,因为它锁定了所有线程的池。jdbc-pool不能做到这一点,所以现在增加了并发性。如果负载增加,响应可能会减少,但吞吐量会增加。
我会开始调整
maxActive匹配您的maxThreads,以便处理并发性。
发布于 2013-03-04 21:07:24
因此,从一种更改到另一种不应该导致任何行为或性能的变化。(参见here)
不过,可能发生变化的是您使用的版本:尤其要注意1.3/1.4的差异。(参见here)
更新库可能是在不进入调试模式的情况下解决问题的唯一方法...
更进一步,您能更具体地说明您所说的“DBCP中的连接泄漏和死锁问题”是什么意思吗?这是一个非常精确的诊断,可以确定死锁和连接池之间是否存在链接:您是如何得出这个结论的?您可能会遇到死锁,因为您的SQL语句很容易导致死锁的发生,而池只能通过同时提供多个连接才能做到这一点-这实际上只是它的工作。
https://stackoverflow.com/questions/13741203
复制相似问题