[Seasar-user:14884] Re: S2JTA + S2Hibernate で、ConnectionPoolImpl からのコネクション取得に失敗することがある

Noriyuki Mizutani [E-MAIL ADDRESS DELETED]
2008年 7月 1日 (火) 18:06:45 JST


小林さん

調査ありがとうございました。
とりあえず、当面 2.4.8 のまま使用する予定です。

参考までにお聞きしたいのですが、2.4.8 では
afterCompletion() での処理が

 1. ConnectionPool#checkInTx() (S2DBCP) → notify()
 2. Hibernate Session に対する close() (S2Hibernate)
  → 論理コネクションに対する close() (Hibernate)

このとき、Hibernate が close() する論理コネクションは
既に別のトランザクションで使用されている可能性があるが、
ConnectionWraperImp の close() では実際には何も
行われないため実害はないという理解でよろしいでしょうか。

よろしくお願いします。

Koichi Kobayashi さんは書きました:
> 小林 (koichik) です.
>
> Date:    Tue, 01 Jul 2008 15:06:05 +0900
> From:    Noriyuki Mizutani <[E-MAIL ADDRESS DELETED]>
> To:      [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:14879] Re: S2JTA + S2Hibernate で、ConnectionPoolImpl からのコネクション取得に失敗することがある
>
>   
>> 2.4.25 のログを整形したものを添付します。
>> (2つのスレッドが絡んで非常に見づらいため、エクセルで
>> 色付けしました)
>>     
>
> ありがとうございました.原因判明しました.
>
> 現在の S2DBCP はトランザクションの終了時に
> コネクションをクローズしてプールに戻しています.
> また,Hibernate もコネクションをクローズします.
> そのため,同じコネクションに対してクローズが
> 2 回行われます.
>
> コネクションプールの maxPoolSize がスレッドより
> 少ないと,S2DBCP がコネクションをプールに戻すと
> 同時に別スレッドがそのコネクションをプールから
> 取り出して使用します.
> その後 Hibernate がコネクションをクローズすると,
> そのコネクションは既に別スレッドで使われているため,
> 今回の現象になってしまいます.
>
> この問題は S2JDBC でも発生する可能性があります.
> S2Dao では発生しません.
>
> 対応するには S2DBCP に大きく手を加えることになるため,
> rc を出すなどリリースまで時間がかかりそうなので,
> 現時点でたまっている修正を 2.4.26 としてリリースした後,
> 2.4.27 での対応にしたいと思います.
>
> SNAPSHOT は早めに出すので,それまでは maxPoolSize を
> 増やして回避していただけないでしょうか.
> よろしくお願いします.
>
>
>   



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