25

我想使用Apache Commons DBCP在 Java 应用程序中启用连接池(这里没有容器提供的数据源)。在 Web 的许多站点(包括Apache 站点)中,该库的使用基于以下代码段:

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

然后你通过 getConnection() 方法获得你的数据库连接。但在其他站点上 - 以及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线程安全的(我可以将它用作类属性)还是我需要同步它的访问?

4

2 回答 2

25

这更像是对 ivi 上述答案的(大)支持评论,但由于需要添加快照,因此将其发布为答案。

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

我想查看 BasicDataSource 中的代码来证实该陈述(事实证明这是真的)。我希望以下快照对未来的读者有所帮助。


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

在此处输入图像描述


  1. 这是原始的连接工厂。

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

  3. 这结合了上述两个(connectionFactory + 一个 Object Pool)来创建一个 PoolableConnectionFactory。
    在此处输入图像描述

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

  4. 最后,从 connectionPool 创建一个 PoolingDataSource
    在此处输入图像描述
于 2013-09-02T12:45:47.537 回答
25

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

PoolableDataSource 使用提供的 ObjectPool 实现 DataSource 接口。PoolingDataSource 负责连接,而 ObjectPool 负责持有和计数这个对象。

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

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

于 2013-01-22T21:19:43.587 回答