在将DBCP替换为Tomcat JDBC池时增加负载并降低性能

Dzi*_*nek 16 performance tomcat load apache-commons-dbcp jdbc-pool

在DBCP中的连接泄漏和死锁问题之后,我们决定用Tomcat JDBC池替换它.当然,迁移非常简单.

但是在我注意到的生产环境中部署之后,运行两个Tomcats的服务器上的负载从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"/>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我想,JDBC_pool应该比开箱即用的DBCP快.

小智 1

您的设置和调整看起来正确。您的负载增加可能是由于服务器同时处理更多并发请求的结果。DBCP 可能阻止服务器承担此负载,因为它从所有线程锁定池。jdbc-pool 不执行此操作,因此现在您已经增加了并发性。如果负载增加,响应可能会降低,但吞吐量会增加。

我会开始调整

maxActive
Run Code Online (Sandbox Code Playgroud)

匹配您的 maxThreads 以处理并发。