与Apache DBCP的连接池

Car*_*ron 22 database-connection apache-commons-dbcp

我想使用Apache Commons DBCP在Java应用程序中启用连接池(此处没有容器提供的DataSource).在Web的许多站点(包括Apache站点)中,库的使用基于以下代码段:

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

然后通过getConnection()方法获得数据库连接.但是在其他站点 - 以及Apache站点 - 数据源实例是通过以下方式实现的:

ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory);
ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory);
PoolingDataSource dataSource = new PoolingDataSource(objectPool);
Run Code Online (Sandbox Code Playgroud)

他们之间有什么区别?我正在使用连接池BasicDataSource,或者我需要一个使用连接池的实例PoolingDataSource?是BasicDataSource线程安全的(我可以将它用作Class属性)还是我需要同步它的访问?

Ash*_*dal 24

这更像是对ivi上面回答的一个(大)支持评论,但由于需要添加快照,我将其作为答案发布.

BasicDataSource是满足基本需求的一切.它在内部创建了PoolableDataSource和ObjectPool.

我想查看BasicDataSource中的代码来证实该语句(事实证明这是真的).我希望以下快照可以帮助未来的读者.


当第一次做a时会发生以下情况 basicDatasource.getConnection().第一次围绕DataSource创建如下:

在此输入图像描述


  1. 这是原始的connectionFactory.

  2. 这是在其余步骤中使用的通用对象池('connectionPool'). 在此输入图像描述

  3. 这结合了以上两个(connectionFactory +一个对象池)来创建PoolableConnectionFactory.
    在此输入图像描述

    值得注意的是,在创建PoolableConnectionFactory期间,connectionPool与connectionFactory链接,如下所示:
    在此输入图像描述

  4. 最后,从connectionPool创建PoolingDataSource
    在此输入图像描述


小智 23

BasicDataSource是满足基本需求的一切.它在内部创建了PoolableDataSource和ObjectPool.

PoolableDataSource使用提供的ObjectPool实现DataSource接口.PoolingDataSource负责连接,ObjectPool负责保存和计算此对象.

我建议使用BasicDataSource.只有,如果你真的需要一些特别的东西,那么你可以将PoolingDatasource与ObjectPool的另一个实现一起使用,但它将是非常罕见和具体的.

BasicDataSource是线程安全的,但您应该注意使用适当的访问器而不是直接访问受保护的字段以确保线程安全.