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

Ippei Nojima [E-MAIL ADDRESS DELETED]
2009年 6月 10日 (水) 17:30:58 JST


ippei です。
素早い対応、ありがとうございます。

> 取り急ぎ、DBFluteInitializerの
> SpringDBCPDataSourceHandlerのgetConnection()を
> 以下のようにしてお試しください。

DBFluteInitializer の該当箇所を修正し、確認してみました。
トランザクション宣言アリ、ナシともに、問題ありませんでした。
(通常通り更新もされるし、枯渇もしない)
もうしばらくは様子を見てみます。

このあたりの処理は、
 org.springframework.jdbc.core.JdbcTemplate.execute(StatementCallback)
も参考になると思いますので、もしよろしければご確認ください。

以上、よろしくお願いいたします。


On Wed, 10 Jun 2009 16:38:58 +0900
kubo <[E-MAIL ADDRESS DELETED]> wrote:

> 久保です。
> 
> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user




※部署名が変わりました。
――――――――――――――――――――――――
 野島 逸平 (Ippei Nojima)
  JFE システムズ株式会社
   SI ソリューション事業部 第 2 開発部
                     基幹ソリューショングループ
  E-mail : [E-MAIL ADDRESS DELETED]
  電話 043-296-6984 (内線2229) FAX 043-296-8418
――――――――――――――――――――――――



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