LoginSignup
3
4

More than 5 years have passed since last update.

Tomcat.jdbc に置ける connection pool に関する設定

Posted at

原因:以下のエラーログでJDBCに接続できなくなった。

 Cased by: java.sql.SQLRecoverableException: クローズされた接続です。

対策:setValidationQuery に "SELECT 1 FROM DUAL" (Oracle) の検証用クエリを入れ setTestOnBorrow(true) を指定すると検証してオブジェクトを破棄して再接続しますが、他にも沢山のパラメータがあるので、一覧でコメントを振って見ました。

public org.apache.tomcat.jdbc.pool.DataSource createDefaultDataSource() {
    org.apache.tomcat.jdbc.pool.DataSource datasource = null;
    PoolConfiguration p = new DefaultProperties();
    // コネクションプールをConnectionPoolMBeanとして登録 初期値は true
    p.setJmxEnabled(true);

    // 検査するアイドル接続に validationQuery を発行して DB との接続を確認するかどうか。 ようするに testOnBorrow, testOnReturn のスレッド版。 true を指定した場合、実際に DB との通信が出来なくなっているオブジェクトを破棄する。 validationQuery が未指定の場合は何もしない。 この検査は、上記の minEvictableIdleTimeMillis での検査後に行われる。 初期値は false 。
    p.setTestWhileIdle(false);
    p.setTestOnBorrow(false);
    p.setTestOnReturn(false);

    // クローズ漏れコネクションの検知を行う場合はtrueに設定
    p.setRemoveAbandoned(false);

    // クローズ漏れを検知した際に、コネクションをクローズしていないアプリのスタックトレースをログに出力する場合に設定
    p.setLogAbandoned(false);

    // コネクションの死活を検証する際に使用するクエリを設定します。 nullもしくは空文字を指定した場合、検証は行われません。デフォルトはnullです。
    p.setValidationQuery(null);

    // プールから取得されるコネクションがここに指定した間隔(ミリ秒)よりも長い間プールされていた場合、コネクションの死活を検証します。初期値は 10000
    p.setValidationInterval(1800000);

    // スレッドの実行間隔 (ミリ秒) を指定する。 1 未満だとスレッドは実行されない。 よって、その場合以下のパラメータ群は指定しても意味を持たない。 初期値は -1 なので、デフォルトではこのスレッドは動作しない。
    p.setTimeBetweenEvictionRunsMillis(10);

    // クローズ漏れとみなすまでの時間 初期値は 60 sec
    p.setRemoveAbandonedTimeout(180);

    // アイドル接続がプール中に居座れる時間。(ミリ秒単位)接続がアイドル状態になってからこの時間を過ぎていると、切断し破棄する。 1 未満は無制限を意味し、決して破棄されなくなる。 次の testWhileIdle の機能を利用するなら、無制限を指定するのも無意味ではない。 初期値は 1800000 (30 分) 。
    p.setMinEvictableIdleTimeMillis(1800000);

    // プールの起動時に作成されるコネクションの初期サイズ 初期値は10
    p.setInitialSize(1);

    // 同時にプールから割り当てることのできるアクティブなコネクションの最大数 初期値は100
    p.setMaxActive(1);

    // プールに保持しておく最大のコネクション数 初期値は maxActive
    p.setMaxIdle(1);

    // プールに保持する最小のコネクション数 初期値は initialSize
    p.setMinIdle(1);

    // 利用可能なコネクションが存在しないときに待機する最大時間(ミリ秒単位) 初期値は 30000 = (30秒)
    p.setMaxWait(30000);

    // コネクションを保持する時間(ミリ秒単位)コネクション返却時に接続時間からmaxAge以上経過していたら、そのコネクションをクローズ。maxAgeによるチェックを行わない。初期値は 0
    p.setMaxAge(180000);

    // getConnectionの呼び出しが FIFO方式で公平に扱われることを希望する場合はtrueに設定。trueに設定することで、アイドル状態のコネクションリストに、org.apache.tomcat.jdbc.pool.FairBlockingQueue実装が使用され、スレッドが到着した順番でコネクションを獲得することが保証される 初期値はtrue
    p.setFairQueue(false);
    datasource = new org.apache.tomcat.jdbc.pool.DataSource();
    datasource.setPoolProperties(p);
    return datasource;
}
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4