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