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

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 7月 2日 (水) 16:00:06 JST


小林 (koichik) です.

Date:    Wed, 02 Jul 2008 15:42:16 +0900
From:    YOKOTA Takehiko <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:14898] Re: S2JTA + S2Hibernate で、ConnectionPoolImpl からのコネクション取得に失敗することがある

> ところで一つ気になっているのですが、なぜS2Daoではいずれの問題も発生し
> ないのでしょうか。参考までに教えていただけませんか?

S2Dao は SQL を発行するたびにコネクションを取得して,
使い終わるとすぐにクローズするため,トランザクション終了後に
コネクションをクローズすることがありません.

トランザクション終了時はコネクションプールがコネクションを
プールに戻すだけです.この操作は afterCompletion で行われます.

一方 S2JDBC や S2Hibernate を使った場合は,これらがコネクションを
コンテキスト (Hibernate は Session) に保持して,トランザクション
終了後 (afterCompletion 時) にクローズします.
通常この操作はコネクションがプールに戻される操作よりも後に
実行されます (Synchronization の登録順).

maxPoolSize よりもコネクションを使用するスレッドの数が多いと,
コネクションがプールに戻された直後にブロックしていたスレッドが
プールからコネクションを取得して使い始めます.

S2JDBC や S2Hibernate のクローズ操作が,すでに他のスレッドによって
使われ始めたコネクションに対して行われると,[CONTAINER-197] の
問題が発生します.[CONTAINER-145] も同じような状況で発生します.

2.4.17 以前は,トランザクション終了後 (afterCompletion 時) も
スレッドにトランザクションが割り当てられていたため,これらの
問題は発生しません.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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