JPA
私のベースレイヤーのストレステスト中DAO
(それぞれ別のスレッドで同時に500回の同時更新を実行しています)。私は次のことに遭遇しました - システムは常に進行できずに動かなくなりました。
問題は、ある時点でどのスレッドにも利用可能な接続がなかったため、実行中のスレッドが進行できなかったことです。
私はこれをしばらく調査しましたが、ルートは私REQUIRES_NEW
の.add
JPA DAO's
したがって、シナリオは次のとおりです。
- テストはトランザクションを開始するために新しい取得を開始し
Connection
ます。ConnectionPool
- いくつかの初期段階の後、私は
add
自分の を呼び出して、存在しないDAO
別の を要求Connection
します。これまでに、 は並行して実行されているテストによって取得されていたためです。ConnectionPool
Connections
DataSource 構成で遊んでみました
c3p0
立ち往生DBCP
立ち往生BoneCP
立ち往生MySQLDataSource
エラーでいくつかの要求が失敗しました - 許可された接続数を超えました。
すべてのデータソースが完全に機能するREQUIRES_NEWを読み取ることで解決しましたが、スタックせずに失敗するだけなので、それでも最良の結果はMySQLDataSourceのようです:)
したがって、高いスループットが期待される場合は、REQUIRES_NEW をまったく使用しないように思われます。
そして私の質問:
この REQUIRES_NEW 問題を防ぐことができる DataSources の構成はありますか?
c3p0 でチェックアウト タイムアウトを試したところ、予想どおり、テストが失敗し始めました。
- 2 秒 - 8 % 合格
- 4 秒 - 12 % 合格
- 6 秒 - 16 % 合格
- 8 秒 - 26 % 合格
- 10 秒 - 34 % 合格
- 12 秒 - 36 % 合格
- 14/16/18 秒 - 40 % 合格
もちろん、これは非常に主観的なものです。
単純な構成の MySQLDataSource は、合格したテストの 20% を提供しました。