[Seasar-user:2298] 高負荷時 ConnectionPool が wait 状態になる

工藤一樹 kazukikudo
2005年 6月 29日 (水) 11:41:07 JST


はじめまして工藤一樹と申します。

負荷テストを実施した際、ConnectionPoolのところでコネクションが取得できな
い現象が発生しました。
取得できないのでスレッドがそこでwaitします。

テスト環境
 TOMCAT 4.1.30
 S2hibernate 1.0.6
    使用しているコンポーネントは下記の通りです。
      org.seasar.extension.jta.TransactionManagerImpl
      org.seasar.extension.dbcp.impl.ConnectionPoolImpl
      org.seasar.hibernate.impl.S2SessionFactoryImpl
      org.seasar.extension.dbcp.impl.DataSourceImpl
      org.seasar.extension.dbcp.impl.XADataSourceImpl

TOMCATで指定している最大スレッド数が20、ConnectionPoolの最大プールサイズ
は10を指定していました。
[最大スレッド数] > [最大プールサイズ] の時に発生します。
[最大スレッド数] ≦ [最大プールサイズ]の時には発生しません。
後者の設定にすれば回避できるのですが、腑(ふ)に落ちなかった為、調べてみ
ました。


waitしているのはConnectionPoolImpl#checkOut()です。
コネクションの空きがない時にwaitします。
waitに対してnotifyしているのがrelease()とcheckIn()です。
しかしトランザクションのコミット時にチェックインしているメソッドは
afterCompletion()から呼び出されたcheckInTx()でした。
このcheckInTx()ではnotifyしていません。
notifyしていなのでwaitが解除されません。
checkInTx()をsynchronized化しメソッドの最後でnotify()を呼び出す様に修正
した所、waitは適切に解除されるようになりました。

なぜcheckInTx()でnotifyしていないのか、修正方法が正しいのかわかりません
が、waitしてしまうのはよろしくないです。

これは不具合になるのでしょうか?

以上、よろしくお願い致します。

-- 
工藤一樹  [E-MAIL ADDRESS DELETED]




Seasar-user メーリングリストの案内