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