16

After problems with connection leak and deadlocks in DBCP we made a decision to replace it with Tomcat JDBC-pool. Of course migration was really simple.

But after deploy it on a production environment I noticed, that load on a server with running two Tomcats increase from 4-4.5 to 5.5. We didn't do anything more, except change of pool. Moreover, performance measured with JMeter decrease by about 5%.

I spent some time to tune pool parameters, but without visible effects. I pasted my current config (from <GlobalNamingResources> in server.xml) below:

<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 and PoolSweeperEnabled are true

In Spring applicationContext-jdbc.xml I have only:

  <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>

What am I doing wrong? I thought, that JDBC_pool should be faster than DBCP out of the box.

4

2 に答える 2

1

設定とチューニングは正しいようです。負荷の増加は、サーバーがより多くの同時リクエストを同時に処理した結果である可能性があります。DBCP は、すべてのスレッドからプールをロックする方法が原因で、サーバーがこの負荷を引き受けることを妨げた可能性があります。jdbc-pool はこれを行わないため、同時実行性が向上しました。また、負荷が増加すると、応答が低下する可能性がありますが、スループットは向上します。

チューニングを始めます

maxActive

同時実行性を処理するために maxThreads に一致させます。

于 2014-02-10T20:35:48.993 に答える
0

あなたの診断は奇妙です: 私の知る限り、Tomcat の DBCP ライブラリは commons-dbcp の再パックされたバージョンにすぎません... したがって、あるものから別のものに変更しても、動作やパフォーマンスが変化することはありません。(こちらをご覧ください

ただし、使用しているバージョンが変更されている可能性があります。特に、1.3/1.4 の違いに注意してください。(こちらをご覧ください

とにかく、あなたの構成は問題ないようです (問題が発生する可能性がありますが、実際には機能します)。ライブラリを更新することは、デバッグモードに入らずに問題を解決する唯一の方法でした...

さらに先に進むために、「DBCP での接続リークとデッドロックの問題」の意味を具体的に教えていただけますか? デッドロックと接続プールの間にリンクがあるかどうかを判断するのは、非常に正確な診断です。どのようにしてこれに至ったのでしょうか? SQL ステートメントはデッドロックを発生させやすいため、デッドロックが発生する可能性がありますが、プールは多くの接続を同時に提供することによってのみ可能になりますが、これは実際の仕事です。

于 2013-03-04T13:07:23.567 に答える