5

既存の質問は似たようなものを表現していますが、ここでは少し異なるニュアンスを呼びたいと思います。

基本的な質問:すべてのアプリケーションサーバーは、接続プールを定義するときに、(little-d、little-s)データソースの(標準)インターフェイスと(ベンダー提供の)実装クラスの両方を指定する機能を提供します。ベンダーがaと通常のol'の両方の実装を提供する場合、どちらが優先されますか?ConnectionPoolDataSourceDataSource

を実装しDataSource、同じ実装クラスにあるベンダーの実装についてはどうでしょうか。ConnectionPoolDataSourceXADataSource

のドキュメントjavax.sql.ConnectionPoolDataSourceは、ほぼ合計で次のように述べています。

PooledConnectionオブジェクトのファクトリ。このインターフェースを実装するオブジェクトは、通常、JavaTM Naming and Directory Interface(JNDI)に基づくネーミングサービスに登録されます。

これは基本的には役に立ちませんが、javax.sql.ConnectionPoolDataSourceそれ自体は拡張されないことに注意してください。つまり、その実装では、ほとんどの呼び出し元が使用するのに慣れているメソッドをjavax.sql.DataSource提供する必要はありません。getConnection()これは、すべてのアプリケーションサーバーが次のいずれかを実行する必要があることを示しています。

  • 呼び出し元が、またはを使用できるようjavax.sql.ConnectionPoolDataSourceに、実装を実装でラップしますjavax.sql.DataSourcejavax.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.DataSourcejavax.sql.ConnectionPoolDataSource

注: Tomcatでこれをどのように行ったか、またはGlassFishで実行した手順について、ここで答えを探しているわけではありません。JDBC仕様、Java EE仕様、バグレポート、またはこれらの個別の(無関係な!)インターフェイスが存在する理由と、それらがどのように統合または区別されるかを示す回答を探しています。したがって、接続プーリングを提供する義務がある汎用JavaEEアプリケーションサーバー上で。

4

2 に答える 2

0

直接使用しないでください。物理接続(別名s)のConnectionPoolDataSourceソースとして使用され、実際に接続プールを実装するによって使用されます。Aは実際にプーリング自体を実装するべきではありません。PooledConnectionDataSourceConnectionPoolDataSource

このようなデータソースは、たとえばアプリケーションサーバーによって提供されます。これは通常、へのJNDI URL(または直接参照)を取り、それ自体が「論理」接続を渡すためのインターフェースをConnectionPoolDataSource公開します。DataSource

DataSource■ JDBC4.1セクション9.4で説明されています。

データソースインターフェイス[..]は、データソース接続を取得するための推奨されるアプローチです。

論理名は、Java Naming and Directory InterfaceTM(JNDI)を使用するネーミングサービスを介してDataSourceオブジェクトにマップされます。DataSourceオブジェクトは、物理データソースを表し、そのデータソースへの接続を提供します。

次に、概要の接続プール(第11章)の説明を見ると、次のように指定されています。

JDBCドライバーは、アプリケーションサーバーが接続プールの構築と管理に使用するConnectionPoolDataSourceの実装を提供します。

接続プールの管理に使用されるアルゴリズムは実装固有であり、アプリケーションサーバーによって異なります。アプリケーションサーバーは、接続プールをクライアントに対して透過的にするDataSourceインターフェースの実装をクライアントに提供します。その結果、クライアントは、以前と同じJNDIおよびDataSource APIを使用しながら、パフォーマンスとスケーラビリティを向上させることができます。(強調鉱山)

DataSource(AS) (以下:ASDS)と(ドライバー) (以下CPDS)の相互作用ConnectionPoolDataSourceについては、セクション11.1〜11.3で説明します。セクション11.3では、相互作用について具体的に説明しています。

次の一連の手順は、JDBCクライアントが接続プーリングを実装するDataSourceオブジェクトからの接続を要求したときに何が起こるかを概説しています。

  • クライアントはDataSource.getConnectionを呼び出します。
  • DataSource実装を提供するアプリケーションサーバーは、接続プールを調べて、適切なPooledConnectionオブジェクト(物理データベース接続)が使用可能かどうかを確認します。特定のPooledConnectionオブジェクトの適合性を判断するには、クライアントのユーザー認証情報またはアプリケーションタイプを照合することや、他の実装固有の基準を使用することが含まれる場合があります。接続プールの管理に関連するルックアップメソッドおよびその他のメソッドは、アプリケーションサーバーに固有です。
  • 使用可能な適切なPooledConnectionオブジェクトがない場合、アプリケーションサーバーはConnectionPoolDataSource.getPooledConnectionメソッドを呼び出して、新しい物理接続を取得します。ConnectionPoolDataSourceを実装するJDBCドライバーは、新しいPooledConnectionオブジェクトを作成し、それをアプリケーションサーバーに返します。
  • PooledConnectionがプールから取得されたか、新しく作成されたかに関係なく、アプリケーションサーバーは、物理接続が現在使用中であることを示すために、内部ブックキーピングを実行します。
  • アプリケーションサーバーは、メソッドPooledConnection.getConnectionを呼び出して、論理接続オブジェクトを取得します。この論理接続オブジェクトは、実際には物理PooledConnectionオブジェクトへの「ハンドル」であり、接続プールが有効な場合にDataSource.getConnectionメソッドによって返されるのはこのハンドルです。
  • アプリケーションサーバーは、メソッドPooledConnection.addConnectionEventListenerを呼び出すことにより、自身をConnectionEventListenerとして登録します。これは、PooledConnectionオブジェクトが再利用可能になったときにアプリケーションサーバーに通知されるようにするために行われます。
  • 論理接続オブジェクトは、基本的なDataSourceの場合と同じ接続APIを使用するJDBCクライアントに返されます。クライアントがメソッドConnection.closeを呼び出すまで、基になるPooledConnectionオブジェクトを再利用できないことに注意してください。

最後の項目は完全に正しいわけではありません。ASDSは、クライアントからConnection取得した新しいものを渡すことにより、クライアントからの論理接続を強制的に閉じる/無効にすることができますPooledConnection(セクション11.4を参照)。

DataSourceここで、コメントで質問に答えます。ASでデータソース構成にとインターフェイスの両方を指定できるのはなぜですかConnectionPoolDataSource。ASDSとCPDSの間の参照は、通常、JNDIを介して行われます。これにより、たとえば、簡単に再構成できます(たとえば、別のASDSでも使用されているため、CPDSの構成を維持しながら、ASDSを別の基盤となるCPDSに切り替えるか、ASDSを通常の基本的なデータソースに切り替える)。JDBC仕様のセクション11.5も参照してください。

接続プーリングを実装するDataSourceオブジェクトをデプロイするには、クライアントに表示されるDataSourceオブジェクトと基礎となるConnectionPoolDataSourceオブジェクトの両方がJNDIベースのネーミング・サービスに登録されている必要があります。

于 2012-10-11T07:32:16.143 に答える