[Seasar-user:17679] Re: [DBFlute] Spring環境で特定環境でDBCPコネクションプールが使い果たされる

kubo [E-MAIL ADDRESS DELETED]
2009年 6月 10日 (水) 16:38:58 JST


久保です。

ippeiさん、こんにちは

取り急ぎ、DBFluteInitializerの
SpringDBCPDataSourceHandlerのgetConnection()を
以下のようにしてお試しください。
(Transaction無し実行が枯渇しないことだけじゃなくて、
 Transactionあり実行がそれまで通りTransactionが有効かどうかも)

public Connection getConnection(final DataSource ds) throws SQLException {
    final Connection conn = DataSourceUtils.getConnection(ds);
    if (DataSourceUtils.isConnectionTransactional(conn, ds)) {
        return new NotClosingConnectionWrapper(conn);
    } else {
        return conn;
    }
}

2009/6/10 Ippei Nojima <[E-MAIL ADDRESS DELETED]>:
>
> ippei です。
> jflute さんの blog では何度かお世話になってます。
>
> さて標記の件、特定環境下で dbcp のコネクションプールが
> 枯渇する問題が起きました。
> 原因は特定できているので、DBFlute 側でどうにか対処できないかな、
> という相談も含めての投稿になります。
>
> -----------------------------
>
> <環境>
>  Java    ; Sun JDK 1.5.0_19
>  DBFlute ; DBFlute 0.9.5
>  Spring  ; Spring Framework 2.5.6
>  DBCP    ; Commons DBCP 1.2.2
>
> <現象>
>  トランザクションプロキシが設定されていないメソッド (*1) を
>  呼び出した際に、コネクションプールが返却されない。
>
>  (*1)
>  <tx:annotation-driven/> 環境下で、@TransactionAttribute、
>  または @Transactional が宣言されていないメソッド。
>  もしくは、それ以外の環境下で TransactionProxyFactoryBean などが
>  設定されていないクラスのメソッド。
>
> <原因>
>  (DBFLUTE-478) 対応ではき出される DBFluteInitializer で
>  DataSourceUtils#getConnection(DataSource) が呼ばれているが、
>  トランザクションマネージャが動作していない環境下でこのメソッドを
>  呼んだ場合、以下のような動作となり、結果コネクションが枯渇する。
>
>  1. DataSourceUtils#getConnection(DataSource) を呼んだ場合、
>     常に DataSource#getConnection() が呼ばれる。
>     (DataSourceUtils の L.113 参照)
>  2. 取得した Connection は、NotClosingConnectionWrapper に
>     ラッピングされるため、DBFlute の動作後に close されない。
>  3. close されないので、コネクションプールに返却されない。
>     (PoolableConnection#close() 参照)
>  4. 解放されないコネクションがたまり、枯渇する。
>
> トランザクションプロキシが設定されている場合は、Spring 自体が
> トランの最後に Connection を close するようになっているため、
> このような問題は発生しない。
>
> -----------------------------
>
> トランザクションプロキシを設定せずに db アクセスをするなど、
> 本来はまずない動作ではあるとは思いますが、トランザクション宣言忘れ、
> select のみなのでプロキシいらない (?)、などを考慮すると、
> 無視はできないのかな、と思っております。
>
> 対応のほど、ご検討ください。
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


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