Domanda

I want to use Apache Commons DBCP to enable connection pooling in a Java Application (no container-provided DataSource in this). In many sites of the web -including Apache site- the usage of the library is based in this snippet:

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

Then you get your DB connections through the getConnection() method. But on other sites -and Apache Site also- the Datasource instance is made through this:

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

What's the difference between them? I'm using connection pooling with BasicDataSource, or I need an instance of PoolingDataSource to work with connection pooling? Is BasicDataSource thread-safe (can I use it as a Class attribute) or I need to synchronize its access?

È stato utile?

Soluzione

BasicDataSource is everything for basic needs. It creates internally a PoolableDataSource and an ObjectPool.

PoolableDataSource implements the DataSource interface using a provided ObjectPool. PoolingDataSource take cares of connections and ObjectPool take cares of holding and counting this object.

I would recommend using BasicDataSource. Only, If you really need something special maybe then you can use PoolingDatasource with another implementation of ObjectPool, but it will be very rare and specific.

BasicDataSource is thread-safe, but you should take care to use appropriate accessors rather than accessing protected fields directly to ensure thread-safety.

Altri suggerimenti

This is more of a (big) supporting comment to ivi's answer above, but am posting it as an answer due to the need for adding snapshots.

BasicDataSource is everything for basic needs. It creates internally a PoolableDataSource and an ObjectPool.

I wanted to look at the code in BasicDataSource to substantiate that statement (which turns out to be true). I hope the following snapshots help future readers.


The following happens when the first time one does a basicDatasource.getConnection(). The first time around the DataSource is created as follows :

enter image description here


  1. This is the raw connectionFactory.

  2. This is the Generic Object Pool ('connectionPool') that is used in the remaining steps. enter image description here

  3. This combines the above two (connectionFactory + an Object Pool) to create a PoolableConnectionFactory.
    enter image description here

    Significantly, during the creation of the PoolableConnectionFactory, the connectionPool is linked with the connectionFactory like so:
    enter image description here

  4. Finally, a PoolingDataSource is created from the connectionPool
    enter image description here
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top