既存の質問は似たようなものを表現していますが、ここでは少し異なるニュアンスを呼びたいと思います。
基本的な質問:すべてのアプリケーションサーバーは、接続プールを定義するときに、(little-d、little-s)データソースの(標準)インターフェイスと(ベンダー提供の)実装クラスの両方を指定する機能を提供します。ベンダーがaと通常のol'の両方の実装を提供する場合、どちらが優先されますか?ConnectionPoolDataSource
DataSource
を実装しDataSource
、同じ実装クラスにあるベンダーの実装についてはどうでしょうか。ConnectionPoolDataSource
XADataSource
のドキュメントjavax.sql.ConnectionPoolDataSource
は、ほぼ合計で次のように述べています。
PooledConnectionオブジェクトのファクトリ。このインターフェースを実装するオブジェクトは、通常、JavaTM Naming and Directory Interface(JNDI)に基づくネーミングサービスに登録されます。
これは基本的には役に立ちませんが、javax.sql.ConnectionPoolDataSource
それ自体は拡張されないことに注意してください。つまり、その実装では、ほとんどの呼び出し元が使用するのに慣れているメソッドをjavax.sql.DataSource
提供する必要はありません。getConnection()
これは、すべてのアプリケーションサーバーが次のいずれかを実行する必要があることを示しています。
呼び出し元が、またはを使用できるよう
javax.sql.ConnectionPoolDataSource
に、実装を実装でラップしますjavax.sql.DataSource
javax.sql.DataSource#getConnection()
javax.sql.ConnectionPoolDataSource
実装が実装でもあることを検出し、javax.sql.DataSource
(どういうわけか)そのgetConnection()
メソッドが委任することを信頼しますgetPooledConnection()
(一体どうやってこれを行うのでしょうか?)
のドキュメントjavax.sql.DataSource
は、部分的に次のように述べています。
DataSourceインターフェースは、ドライバーベンダーによって実装されます。実装には次の3つのタイプがあります。
- 基本的な実装-標準のConnectionオブジェクトを生成します
- 接続プールの実装-接続プールに自動的に参加する接続オブジェクトを生成します。この実装は、中間層の接続プールマネージャーで機能します。
- 分散トランザクションの実装-分散トランザクションに使用できるConnectionオブジェクトを生成し、ほとんどの場合、接続プーリングに参加します。この実装は、中間層のトランザクションマネージャーで機能し、ほとんどの場合、接続プールマネージャーで機能します。
これも役に立たず、起動するのに不正確です(または、少なくとも指定が不十分です。javax.sql.DataSource
アプリケーションサーバーベンダーによっても実装されます。アプリケーションサーバーベンダーは、クライアントコードが(たとえば)javax.sql.DataSource
サーバー側コードにを挿入できるように実装を提供する必要があります)。また、接続プールが特定の実装によって提供される場合と提供されない場合があることを意味しているようです。これにより、(インターフェイスではなく)インターフェイスDataSource
を指定した接続プールが設定されたときにアプリケーションサーバーがどのように通知するのか疑問に思います。。javax.sql.DataSource
javax.sql.ConnectionPoolDataSource
注: Tomcatでこれをどのように行ったか、またはGlassFishで実行した手順について、ここで答えを探しているわけではありません。JDBC仕様、Java EE仕様、バグレポート、またはこれらの個別の(無関係な!)インターフェイスが存在する理由と、それらがどのように統合または区別されるかを示す回答を探しています。したがって、接続プーリングを提供する義務がある汎用JavaEEアプリケーションサーバー上で。