[Seasar-user:18706] Re: [S2DBCP] DB再起動後のコネクション取得について

takiguchi [E-MAIL ADDRESS DELETED]
2009年 10月 21日 (水) 00:26:41 JST


瀧口です。

今手元に環境がないため、ログは明日取得してみます。

> それ以前に,例えば prepareStatement() 等で
> 本来のコネクションが例外をスローすると,
> ConnectionWrapperImpl#release() 経由で
> ConnectionPoolImpl#release() が呼ばれ,
> コネクションはプールから除去されます.
ここですが、デバッガで追ったとき prepareStatement() は例外にならず、
その後の executeQuery() で例外になっていました。
そのため ConnectionPoolImpl#release が呼ばれず、ConnectionPoolImpl#checkInTx の
txActivePool.remove(tx) でコネクションが戻ってきてしまうようですね。


2009/10/20 Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>:
> 小林 (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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


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