[Seasar-user:18705] Re: [S2DBCP] DB再起動後のコネクション取得について
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2009年 10月 20日 (火) 23:30:07 JST
小林 (koichik) です.
Date: Tue, 20 Oct 2009 22:54:18 +0900
From: takiguchi <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:18703] Re: [S2DBCP] DB再起動後のコネクション取得について
> >S2DBCP では,例外が発生したコネクションは
> >プールに戻さないようになっています.
> というのは正確ではなく、実際には
> 例外が発生した場合のロールバックで例外が発生したコネクションはプールに戻さない、
> という動きになっています。
> 実際のコードですと、TransactionImpl#rollbackResources で、
> ロールバックで例外が発生した場合に status に Status.STATUS_UNKNOWN を、
> それ以外の場合 Status.STATUS_ROLLEDBACK を設定しています。
> この status の値が ConnectionPoolImpl.SynchronizationImpl#afterCompletion に渡され、
> STATUS_COMMITTED か STATUS_ROLLEDBACK の場合 ConnectionPoolImpl#checkInTx が呼ばれています。
それ以前に,例えば prepareStatement() 等で
本来のコネクションが例外をスローすると,
ConnectionWrapperImpl#release() 経由で
ConnectionPoolImpl#release() が呼ばれ,
コネクションはプールから除去されます.
activePool.remove(connection);
Transaction tx = getTransaction();
if (tx != null) {
txActivePool.remove(tx);
}
なので,ロールバックにおいて
ConnectionPoolImpl#checkInTx() が呼び出されても,
該当のコネクションはプールに含まれていないため,
ConnectionPoolImpl#checkInFreePool() に
制御が渡ることはありません.
ConnectionWrapper con = (ConnectionWrapper) txActivePool.remove(tx);
if (con == null) {
return;
}
checkInFreePool(con);
よって,コネクションがプールに戻ることは
ないはずです.
実際にコネクションがプールに戻るなら,
ロールバック時の問題ではなく,最初に例外が
発生した時点で想定外の状況になっているように
思われます.
トランザクション開始時からの一連のログを
見せていただけないでしょうか.
--
<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 メーリングリストの案内