質問: (DataSource)InitialContext.doLookup(JNDI_JDBC_NAME); return dataSource ; } catch (NamingException e) { e.printStackTrace(); return null; } } ``` としましたが。 dataSourceをstaticで定義しているのでlookupがアプリ実行中1回しか実行されないのでは? と思っています。 ※ただstaticで定義する必要性もぼんやり理解はできます。(DaoImplで都度Configをnewしているためと思ってます。) プールの取得はlookupをしたときで、プールの解放はConnectionの切断の時と私は認識しているのですが・・・、これも自信がなくなってきています。 初歩的な質問となりますが、ご教授のほどよろしくおねがいします。
回答: > > dataSourceをstaticで定義しているのでlookupがアプリ実行中1回しか実行されないのでは? > > と思っています。 > > > これはその通りですが、コネクションの取得はDataSource#getConnection()するたびに行われます。そのため、プール自体が無意味なものではありません。 Connection=DataSource もしくは Connectionの別名=DataSourceと考えていませんか? まず、DataSource(データの元ネタ)とConnection(論理的実体としてのDBとの接続)は別のオブジェクトです。通常、分散トランザクション環境では、DataSourceはデータコネクションのプールを「接続の元ネタ」として返してきます。APPはdatasource.getConnection()して、コネクションプールがプールしているコネクションから1つだけコネクションを取得します。 Connection#close()した場合は自動的な接続を待たずに、Connectionを切断します。 ただこの場合も、直接オブジェクトが破棄されるかは別問題です。プール側で参照を保持ししていて、isClose=trueとなったコネクションをどう扱うかはコネクションプールの実装依存です。 (普通は再利用するか、破棄→再接続でしょう。) 最終的に、プールの解放はAPPの停止時になるはずですがいかがでしょうか?(そこまで参照が切れないので) 参考まで、JavaAPI仕様の該当箇所をリンクします。