0

Tomcat で OpenEJB を使用します (JBoss、Weblogic などで実行するために使用されます)。負荷テストの実行中に、JMS メッセージ (キュー) の処理で重大なパフォーマンスの問題が発生します。問題は、データベース接続プールがプールへの接続を取得または解放する際のブロックに限られていました。ブロッキングによって同時 MDB インスタンス (スレッド) の実行が妨げられたため、パフォーマンスが 10 倍以上低下しました。アプリケーション サーバーで (それぞれの接続プールの実装を使用して) 実行するために使用される同じコードは、まったくブロックされません。

ブロックされたスレッドの例:

Name: JMS Resource Adapter-worker-23
State: BLOCKED on org.apache.commons.pool.impl.GenericObjectPool@1ea6b4a owned by: JMS Resource Adapter-worker-19
Total blocked: 18,426  Total waited: 0

Stack trace: 
org.apache.commons.pool.impl.GenericObjectPool.returnObject(GenericObjectPool.java:916)
org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:91)
   - locked org.apache.commons.dbcp.PoolableConnection@1bcba8
org.apache.commons.dbcp.managed.ManagedConnection.close(ManagedConnection.java:147)
com.xxxxx.persistence.DbHelper.closeConnection(DbHelper.java:290)
....

いくつか質問があります。

  1. 一部のトランザクション属性とプロパティがこのブロックに寄与していることはほぼ確実ですが、MDB は非トランザクションとして定義されています (注釈と ejb-jar.xml の両方を使用しています)。ただし、一部の EJB はコンテナー管理のトランザクションを使用します (そこでもブロックを観察できます)。ブロッキングを修正できる DBCP 構成はありますか?
  2. DBCP接続プールの実装はOpenEJBで置き換え可能ですか? それを別のライブラリに置き換えるのはどれくらい簡単(難しい)ですか?

念のため、これが OpenEJB (openejb.xml) でデータ ソースを定義する方法です。

<Resource id="MyDataSource" type="DataSource">
  JdbcDriver oracle.jdbc.driver.OracleDriver
  JdbcUrl ${oracle.jdbc}
  UserName ${oracle.user}
  Password ${oracle.password}
  JtaManaged true
  InitialSize 5
  MaxActive 30
  ValidationQuery SELECT 1 FROM DUAL
  TestOnBorrow true
</Resource>
4

2 に答える 2

1

私の2カラット...

1 - ブロッキングを修正できる DBCP 構成はありますか?

ドキュメントには表示されませんが、「BLOCK」(値 1) または「 FAIL" (値 0)。これは、Pools コモンから直接来ています。Hibernate と Cayenne の両方がこの DBCP 設定を使用します。ただし、OpenEJB については知りません。

もちろん、すべての接続が忠実に閉じられている場合にのみこれが機能することは言うまでもありません (これは保証するのが難しい場合があります)。次に、アクティビティのピーク時に必要な接続数を JMX で確認し、maxActive をこれらの測定値から得られたより高い値に設定できます。

2 - DBCP 接続プールの実装は OpenEJB で置き換え可能ですか? それを別のライブラリに置き換えるのはどれくらい簡単(難しい)ですか?

申し訳ありませんがわかりません。はいと想像します。または、DBCP が別の接続プール マネージャを許可する可能性があります。

更新: コードを調べたところ、DBCP が接続プーリングの唯一のオプションのようです。

ちなみに、whenExhaustedAction の設定を見てきました。openejb.xml ではサポートされていません。
ただし、Oracle データベースを使用しているため、まだ 1 つのオプションが残っています。
Oracle の暗黙的な接続キャッシュ (バージョン 10g を想定) を使用し、DBCP に任意の「十分な」量の接続を残すこともできます。そのためには、openejb.xml リソース ブロックでConnectionPropertiesプロパティを構成し、Oracle JDBC 接続プロパティを使用する必要があります。つまりconnectionCachingEnabled=true、 少なくともconnectionCacheNameconnectionCachePropertiesです。このようにして、DBCP が実際の仕事をしていて、実際に Oracle のプーリング メカニズムを使用していると信じ込ませることができます。これはまた、DBCP でほとんどリスクを冒さないことを意味し、それによって maxActive 設定のより自由なサイジングを行います。

于 2011-02-02T21:01:15.817 に答える
1

プール構成 ( openejb.xml )を変更することにより、dbcp のブロックに関する問題が解決されました。

TestOnBorrow false

OpenEJB チームのAndyさん、ありがとうございます。

于 2011-02-18T16:59:18.990 に答える