25

Apache Commons DBCPを使用して、Javaアプリケーションで接続プールを有効にしたい(これにはコンテナーが提供するデータソースはありません)。Apacheサイトを含むWebの多くのサイトでは、ライブラリの使用法は次のスニペットに基づいています。

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(クラス属性として使用できますか)、またはアクセスを同期する必要がありますか?

4

2 に答える 2

25

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

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

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

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

于 2013-01-22T21:19:43.587 に答える
25

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

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

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


初めて実行すると、次のようになり basicDatasource.getConnection()ます。初めてのデータソースは次のように作成されます。

ここに画像の説明を入力してください


  1. これは生のconnectionFactoryです。

  2. これは、残りの手順で使用される汎用オブジェクトプール(「connectionPool」)です。 ここに画像の説明を入力してください

  3. これにより、上記の2つ(connectionFactory +オブジェクトプール)が組み合わされて、PoolableConnectionFactoryが作成されます。
    ここに画像の説明を入力してください

    重要なことに、PoolableConnectionFactoryの作成中に、connectionPoolは次のようにconnectionFactoryにリンクされます。
    ここに画像の説明を入力してください

  4. 最後に、PoolingDataSourceがconnectionPoolから作成されます
    ここに画像の説明を入力してください
于 2013-09-02T12:45:47.537 に答える