[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 メーリングリストの案内