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

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


ippei です。

スナップショットへの反映、ありがとうございます。
こちらでダウンロードして確認してみました。
先ほどの手修正と同じように、問題なく動作しているようです。
一応、開発中のリソースに反映させておきました。

> また、リリースタイミングについて希望がありましたらご相談ください。
> (そろそろ開発が終わるので早めににリリースして欲しいとか)

お心遣い、感謝します。
こちらはまだ始まったばかりで、検証がほとんどですので、
久保さんのペースでやっていただければ十分です。

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


On Wed, 10 Jun 2009 18:13:54 +0900
kubo <[E-MAIL ADDRESS DELETED]> wrote:

> 久保(jflute)です。
> 
> ご確認ありがとうございます。
> こちらでも、dbflute-spring-exampleにて
> 同じ現象を再現させて、修正に問題が発生しないことを
> 確認できました。(他の処理が問題ないことも確認)
> (NoTransactionTestがそれです)
> 
> 様子を見て、また何かあれば言ってください。
> 一応、この修正をdbflute-0.9.5.1に反映させました。
> http://dbflute.sandbox.seasar.org/download/dbflute/dbflute-0.9.5.1-SNAPSHOT.zip
> でダウンロード可能です。
> また、リリースタイミングについて希望がありましたらご相談ください。
> (そろそろ開発が終わるので早めににリリースして欲しいとか)
> 
> > org.springframework.jdbc.core.JdbcTemplate.execute(StatementCallback)
> ありがとうございます。
> なるほど、こういうクラスがあるのですね。参考になります。
> 
> 
> 
> 2009/6/10 Ippei Nojima <[E-MAIL ADDRESS DELETED]>:
> >
> > 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 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 メーリングリストの案内