【问题标题】:Increase load and decrease performance while replace DBCP to Tomcat JDBC-pool将 DBCP 替换为 Tomcat JDBC 池时增加负载并降低性能
【发布时间】:2012-11-24 08:09:03
【问题描述】:

在 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 更快。

【问题讨论】:

  • 尝试 testWhenIdle="true",并尝试将 maxActive 的数量从 100 减少到 20 左右。可能池中的连接过多会减慢速度。
  • 你使用的验证查询和以前一样吗?
  • @rootkit007 - 不,使用 dbcp 我没有使用 ant 验证查询。
  • 尝试一个不访问数据库的验证查询。一些 SQL 服务器很古怪,但通常像“选择真”这样的东西就可以正常工作,并且不涉及访问任何表
  • 你可能不应该testOnBorrow - 这太贵了,试试testOnReturn

标签: performance tomcat load apache-commons-dbcp jdbc-pool


【解决方案1】:

您的设置和调整显示正确。您的负载增加可能是由于服务器同时处理更多并发请求。 DBCP 可能已阻止服务器承担此负载,因为它从所有线程中锁定了池。 jdbc-pool 不这样做,所以现在您增加了并发性。如果负载增加,响应可能会减少,但您的吞吐量会增加。

我会开始调整

maxActive

匹配你的 maxThreads 以处理并发。

【讨论】:

    【解决方案2】:

    您的诊断很奇怪:AFAIK Tomcat 的 DBCP 库只是 commons-dbcp 的重新打包版本...因此从一个更改为另一个不应导致行为或性能发生任何变化。 (见here

    您使用的版本可能有所改变:尤其要注意 1.3/1.4 的差异。 (见here

    无论如何,您的配置似乎没问题(尽管您可能会遇到问题,但它确实有效)。更新您的库可能是在不进入调试模式的情况下解决问题的唯一方法...

    更进一步,您能否更具体地说明“DBCP 中的连接泄漏和死锁问题”是什么意思?确定死锁和连接池之间存在联系是一个非常精确的诊断:您是怎么得出这个结论的?您可能会遇到死锁,因为您的 SQL 语句很容易发生死锁,而池只能通过同时提供多个连接来实现死锁——这实际上就是它的工作。

    【讨论】:

    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 2020-08-22
    • 2018-02-09
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多