在 DBCP 出现连接泄漏和死锁问题后,我们决定用 Tomcat JDBC 池替换它。当然迁移非常简单。
但在将其部署到生产环境后,我注意到运行两个 Tomcat 的服务器上的负载从 4-4.5 增加到 5.5。除了换泳池,我们什么也没做。此外,使用 JMeter 测量的性能下降了约 5%。
我花了一些时间调整池参数,但没有明显效果。我在下面粘贴了我当前的配置(来自 <GlobalNamingResources>
中的 server.xml
):
<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 更快。
最佳答案
您的设置和调整看起来是正确的。您的负载增加可能是服务器同时处理更多并发请求的结果。 DBCP 可能已阻止服务器承担此负载,因为它如何锁定所有线程的池。 jdbc-pool 不会这样做,所以现在您已经增加了并发性。如果负载增加,响应可能会减少,但您的吞吐量会增加。
我会开始调音
maxActive
匹配您的 maxThreads 以处理并发。
关于performance - 将 DBCP 替换为 Tomcat JDBC 池时增加负载并降低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13741203/