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

Satou Mamoru [E-MAIL ADDRESS DELETED]
2009年 10月 20日 (火) 01:05:16 JST


はじめまして。佐藤です。

S2DBCPでDB再起動後のコネクションの扱いについて教えてください。

【環境】
Seasar 2.4.39
SAStruts 1.0.4

・jdbc.dicon
----------------- ここから---------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components namespace="jdbc">
    <include path="jta.dicon"/>

    (中略)

    <component name="connectionPool"
        class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
        <property name="timeout">600</property>
        <property name="maxPoolSize">100</property>
        <property name="validationQuery">"select count(*) from dual"</property>
        <property name="validationInterval">60000</property>
        <destroyMethod name="close"/>
    </component>

    <component name="DataSource"
        class="org.seasar.extension.dbcp.impl.DataSourceImpl"
    />
</components>
----------------- ここまで ---------------------------------------

SAStruts + S2JDBCでDBアクセスをしています。
コネクションプールはS2JDBC標準のS2DBCPを使っています。
特に問題なく使えているのですが、DB再起動後の接続で少し困ったことがあります。

プールにコネクションが格納されている状態でAPサーバは再起動せず、DBサーバのみ再起動を行なうと、
プール内のコネクションは無効になると思いますが、
validationInterval の時間が経過した後にコネクションの取得を試みると、
コネクションの死活検証実施→接続不可→物理コネクションの再取得
という流れによって、再びDB接続できるようになると理解しています。

ただ、validationInterval に満たない間隔でDBアクセスを繰り返すと、

プールから無効なコネクション取得⇒validationInterval の間隔に満たないので検証未実施⇒
接続失敗⇒プールにコネクションを戻す

このような流れになると思います。ここで、最後の「プールにコネクションを戻す」
のところで、死活検証で参照されると思われる値(ConnectionPoolItem.FreeItem#pooledTime)も
更新されてしまう?ようで、validationInterval よりも短い間隔でアクセスを繰り返すと、
延々無効なコネクションがプールから取得されてしまうようです。

この現象を回避する何かよい方法はないでしょうか?
APサーバは再起動せずDBサーバのみ再起動する前提です。
今のところ validationInterval を短くして、なるべく発生しないようにする
ぐらいしか思いつきませんが、ほぼ毎回死活チェックが走るのもどうなのか
という気がしています。

よろしくお願いします。


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