我想使用Apache Commons DBCP在Java应用程序中启用连接池(此处没有容器提供的DataSource)。在网络的许多网站中 - 包括Apache site - 该库的使用基于以下代码段:
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setUrl(connectURI);
然后通过getConnection()方法获得数据库连接。但在其他网站上 - 和Apache Site also - 数据源实例是通过以下方式实现的:
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory);
ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory);
PoolingDataSource dataSource = new PoolingDataSource(objectPool);
他们之间有什么区别?我正在使用BasicDataSource
的连接池,或者我需要一个PoolingDataSource
的实例来处理连接池? BasicDataSource
是否是线程安全的(我可以将它用作Class属性)还是需要同步其访问权限?
答案 0 :(得分:24)
这更像是对ivi上述答案的一个(大)支持评论,但由于需要添加快照,我将其作为答案发布。
BasicDataSource是基本需求的一切。它在内部创造了一个 PoolableDataSource和ObjectPool。
我想查看BasicDataSource中的代码来证实该语句(结果证明是真的)。我希望以下快照可以帮助未来的读者。
第一次进行basicDatasource.getConnection()
时会发生以下情况。第一次围绕DataSource创建如下:
这是原始的connectionFactory。
这是在其余步骤中使用的通用对象池('connectionPool')。
这结合了以上两个(connectionFactory +一个对象池)来创建PoolableConnectionFactory。
值得注意的是,在创建PoolableConnectionFactory期间,connectionPool与connectionFactory链接如下:
< / p>
答案 1 :(得分:22)
BasicDataSource是基本需求的一切。 它在内部创建了PoolableDataSource和ObjectPool。
PoolableDataSource使用提供的ObjectPool实现DataSource接口。 PoolingDataSource负责连接,ObjectPool负责保存和计算这个对象。
我建议使用BasicDataSource。 只有,如果你真的需要特别的东西,那么你可以将PoolingDatasource与ObjectPool的另一个实现一起使用,但它将是非常罕见和具体的。
BasicDataSource是线程安全的,但您应该注意使用适当的访问器而不是直接访问受保护的字段以确保线程安全。