45134


Struts1.x で Doma1を導入しようとしているのですが、DomaでJNDI経由でDataSourceを取得する箇所でつまづいてしまいました・・・。

[関連サイト](http://hakobera.hatenablog.com/entry/20100826/1282817099)を参考にして、実行することは出来たのですが、接続プールに関して全く理解できておらず前に進めない状態です・・・。

Configクラスを[Doma チュートリアル](http://doma.seasar.org/tutorial/index.html)を参考に・・・

[code]

    public class AppConfig extends DomaAbstractConfig {
    
    protected static final DataSource dataSource = createDataSource();
    protected static final Dialect dialect = new MssqlDialect();
    
    public DataSource getDataSource() {
        return dataSource;
    }
    
    public Dialect getDialect() {
        return dialect;
    }
    
    protected static DataSource createDataSource() {
        try {
            DataSource dataSource = (DataSource)InitialContext.doLookup(JNDI_JDBC_NAME);
            return dataSource ;
        } catch (NamingException e) {
            e.printStackTrace();
            return null;
        }
    }
    
[/code]

としましたが。  
dataSourceをstaticで定義しているのでlookupがアプリ実行中1回しか実行されないのでは？  
と思っています。  
※ただstaticで定義する必要性もぼんやり理解はできます。(DaoImplで都度Configをnewしているためと思ってます。)

プールの取得はlookupをしたときで、プールの解放はConnectionの切断の時と私は認識しているのですが・・・、これも自信がなくなってきています。

初歩的な質問となりますが、ご教授のほどよろしくおねがいします。


CC BY-SA 4.0
2018-06-28T00:52:03.177
45107
2018-06-29T06:13:17.887
2018-06-29T06:13:17.887
2808
27196
question
java jdbc
DomaでJNDI経由でDataSourceを取得する場合の接続プールについて


> 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仕様の該当箇所をリンクします。  
<https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Connection.html>  
<https://docs.oracle.com/javase/jp/8/docs/api/javax/sql/DataSource.html>


CC BY-SA 4.0
2018-06-28T15:19:30.180
45133
2018-06-28T15:19:30.180
10174
45107
answer


もしかすると[パッケージ
`jvax.sql`のJavaDoc](https://docs.oracle.com/javase/jp/10/docs/api/javax/sql/package-
summary.html)
「DataSourceオブジェクトを使用した接続の確立」「接続プールと文のプール」辺りを読むと疑問は解消するかもしれません(Java
EEにおける説明になっていますが、事情はStruts1でも同様でしょう)。

* * *

> プールの取得はlookupをしたときで、プールの解放はConnectionの切断の時と私は認識しているのですが・・・

「解放」という単語の意図するところが不明確ですが、削除するという意味であれば(少なくとも)ユーザプログラムでプールを削除することはありません。  
そもそもユーザプログラムでは接続プールを意識することは無い、すなわち取得/解放(がどんな意味であろうとも)を明示的には行いません。  
ですので回答としては「その認識は誤っています」ということになります。

接続プールを参照し、その参照を終えるのはいつか、ということであれば、`DataSource#getConnection()`メソッド内、という回答になります(これについての詳細は冒頭リンク参照)。ただしこれも我々が実装する部分ではないです。

> dataSourceをstaticで定義しているのでlookupがアプリ実行中1回しか実行されないのでは？

こちらはその通りです。`AppConfig`実装者はJNDIルックアップをコストの高い処理だと考えており、最初の1回だけ問い合わせを行えば良いようにしよう、と考えこのような形にしています。  
パフォーマンスを理由にした実装なのでここではあまり本質的ではありません。  
都度JNDIルックアップすると駄目かというと、そういうわけではないです。


CC BY-SA 4.0
2018-06-28T15:20:33.023
45134
2018-06-28T15:20:33.023
2808
45107
answer