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