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

kubo [E-MAIL ADDRESS DELETED]
2009年 6月 10日 (水) 18:13:54 JST


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