使用Apache DBCP的连接池技术

25

我希望在Java应用程序中使用Apache Commons DBCP实现连接池(不使用容器提供的DataSource)。在许多网站上,包括Apache网站,该库的使用基于以下代码片段:

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

您可以通过调用getConnection()方法获取DB连接。但是在其他网站上以及Apache官网上,Datasource实例是通过以下方式创建的:

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

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

2个回答

25

BasicDataSource是满足基本需求的全部内容。 它内部创建了一个PoolableDataSource和一个ObjectPool。

PoolableDataSource使用提供的ObjectPool实现了DataSource接口。PoolingDataSource负责连接,ObjectPool则负责维护和计数此对象。

我建议使用BasicDataSource。 只有当您真正需要特殊的东西时,才可以使用另一种ObjectPool实现的PoolingDatasource,但这将非常罕见和具体。

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


“适当的访问器”是什么意思?同步块吗? - Carlos Gavidia-Calderon
BasicDataSource是线程安全的,因为所有变量都通过同步读取/写入。 因此,我认为您不需要使用同步块。 如果您正在扩展此类,则应注意使用适当的访问器,而不是直接访问受保护的字段以确保线程安全,但您不需要使用同步块。 - ivi

24

这更像是对ivi上面答案的支持性评论,但由于需要添加截图,所以我将其发布为答案。

BasicDataSource 对基本需求来说就是一切。它内部创建了一个 PoolableDataSource 和一个 ObjectPool。

我想查看 BasicDataSource 中的代码来证实该语句是否正确(结果证明是正确的)。我希望以下截图能够帮助未来的读者。


当第一次使用 basicDatasource.getConnection() 时,会执行以下操作。第一次执行时 DataSource 被创建如下:

enter image description here


  1. 这是原始连接工厂(connectionFactory)。

  2. 这是剩余步骤中使用的通用对象池(connectionPool)。 enter image description here

  3. 这将上述两者(connectionFactory + 对象池)结合起来创建 PoolableConnectionFactory。
    enter image description here

    显著的是,在创建 PoolableConnectionFactory 期间,将 connectionPool 与 connectionFactory 关联起来,如下所示:
    enter image description here

  4. 最后,从 connectionPool 创建了一个 PoolingDataSource。
    enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接