2012-12-06 27 views
15

DBCPの接続リークとデッドロックの問題が発生した後、Tomcat JDBC-poolに置き換えることにしました。もちろん、移行は本当に簡単でした。DBCPをTomcat JDBC-poolに置き換えて負荷を増やしてパフォーマンスを落とすJDBC-pool

しかし、私が気づいた実稼働環境に展開した後、2台のTomcatを実行しているサーバーの負荷は4-4.5から5.5に増加します。私たちはプールの変更以外は何もしませんでした。さらに、JMeterで測定した性能は約5%低下します。

私はプールパラメータを調整するのに少し時間を費やしましたが、目に見える効果はありませんでした。 FairQueueとPoolSweeperEnabledは、私が唯一持っている春のApplicationContext-jdbc.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"/> 

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

私は何を下回る(server.xml<GlobalNamingResources>から)私の現在の設定を貼り付け間違っている?私は、JDBC_poolはDBCPよりも速くなければならないと考えました。

+0

testWhenIdle = "true"を試してみて、maxActiveの数を100から最小限に減らしてみてください。プール内の接続が多すぎると処理が遅くなる可能性があります。 –

+1

以前と同じ検証クエリを使用していますか? – rootkit

+0

@ rootkit007 - いいえ、dbcpで私はantの検証クエリを使用しませんでした。 – Dzinek

答えて

0

あなたの診断は異常です:AFAIK TomcatのDBCP libは、commons-dbcpの単なるリパック版です...そのように変更すると、動作やパフォーマンスに変化はありません。 (hereを参照)

使用しているバージョンは変更されていますが、特に1.3/1.4の違いに注意してください。 (hereを参照してください)

とにかく、あなたの設定は問題ありません。実際に問題が発生しても問題はありません。あなたのライブラリを更新することはおそらく、デバッグモードに入ることなくあなたの問題を解決する唯一の方法でした...

「接続リークとデッドロックの問題」の意味をもっと具体的にすることはできますか?デッドロックと接続プールの間にリンクがあるかどうかを判断するのは非常に正確な診断です:どのようにこれに来ましたか? SQLステートメントはデッドロックを起こしやすいため、デッドロックが発生している可能性がありますが、プールは複数の接続を同時に提供することで可能になります。

+0

OPは、Tomcatの再パッケージ化されたdbcpとは異なるTomcat jdbc-poolについて話しています。 http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – dnault

1

設定と調整が正しく表示されます。負荷の増加は、サーバーがより多くの同時要求を同時に処理した結果である可能性があります。 DBCPによって、プールがすべてのスレッドからどのようにロックされたかによって、サーバーがこの負荷を引き受ける可能性があります。 jdbc-poolはこれを行わないので、並行性が向上しました。負荷が増加すると応答が低下する可能性がありますが、スループットは向上します。

私は並行性を扱うためにあなたのmaxThreadsのに合わせて、チューニング

maxActive 

を開始すると思います。

関連する問題