web-dev-qa-db-ja.com

Apache DBCPによる接続プーリング

私は Apache Commons DBCP を使用してJavaアプリケーション(この中にコンテナ提供のデータソースはありません)で接続プーリングを有効にします)を使用したいと思います。 Apacheサイト -ライブラリの使用はこのスニペットに基づいています:

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("Oracle.jdbc.driver.OracleDriver");
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setUrl(connectURI);  

次に、getConnection()メソッドを使用してDB接続を取得します。しかし、他のサイトでは-および Apacheサイトも -データソースインスタンスは次のように作成されます。

ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory);
ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory);
PoolingDataSource dataSource = new PoolingDataSource(objectPool);

それらの違いは何ですか? BasicDataSourceで接続プールを使用していますか、または接続プールを使用するにはPoolingDataSourceのインスタンスが必要ですか? BasicDataSourceはスレッドセーフ(クラス属性として使用できますか)ですか、それともアクセスを同期する必要がありますか?

BasicDataSourceは、基本的なニーズのためのすべてです。内部でPoolableDataSourceとObjectPoolを作成します。

PoolableDataSourceは、提供されたObjectPoolを使用してDataSourceインターフェースを実装します。 PoolingDataSourceは接続を処理し、ObjectPoolはこのオブジェクトの保持とカウントを処理します。

BasicDataSourceの使用をお勧めします。唯一、本当に特別なものが必要な場合は、ObjectPoolの別の実装でPoolingDatasourceを使用できますが、これは非常にまれで具体的です。

BasicDataSourceはスレッドセーフですが、スレッドセーフを確保するには、保護されたフィールドに直接アクセスするのではなく、適切なアクセサーを使用するように注意する必要があります。

24
ivi

これは、上記のiviの回答に対する(大きな)サポートコメントの詳細ですが、スナップショットを追加する必要があるため、回答として投稿しています。

BasicDataSourceは、基本的なニーズのためのすべてです。内部的にはPoolableDataSourceとObjectPoolを作成します。

BasicDataSourceのコードを見て、そのステートメントを実証したいと思いました(これは真実であることが判明しました)。次のスナップショットが将来の読者の役に立つことを願っています。


初めてbasicDatasource.getConnection()を実行すると、次のことが起こります。 DataSourceが初めて作成されるのは次のとおりです。

enter image description here


  1. これは生のconnectionFactoryです。

  2. これは、残りの手順で使用される汎用オブジェクトプール( 'connectionPool')です。 enter image description here

  3. 上記の2つ(connectionFactory +オブジェクトプール)を組み合わせて、PoolableConnectionFactoryを作成します。
    enter image description here

    重要なことに、PoolableConnectionFactoryの作成中に、connectionPoolは次のようにconnectionFactoryとリンクされます。
    enter image description here

  4. 最後に、poolingDataSourceがconnectionPoolから作成されます
    enter image description here
25
Ashutosh Jindal