[Seasar-user:17677] [DBFlute] Spring環境で特定環境でDBCPコネクションプールが使い果たされる
Ippei Nojima
[E-MAIL ADDRESS DELETED]
2009年 6月 10日 (水) 16:01:14 JST
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 メーリングリストの案内