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