8

我的应用程序在多个线程中执行多个查询。使用Apache DBCP的多线程

现在我正在为每个查询创建新的连接,我想使用池来提高效率。

Apache DBCP池是否可以同时在多个线程中工作,或者它会在每个线程的某些同步方法上“阻塞”?

如果封锁,我可以使用别的东西吗?

UPDATE

本文内容:link说:

因为所有的Oracle JDBC API方法是同步的,如果两个线程 尝试同时使用的连接对象,然后一会 被迫等到另一个人完成使用。

所以我想DBCP将无法处理?

我也意识到在这种情况下池不会帮助我,因为每个线程都会要求连接,并且每次线程都会生成一个新连接(直到某些线程结束并返回连接到池)

+1

为了补充下面的很好的答案,getConnection()'可能会阻塞的唯一时间是如果你的池中没有更多的'Connection'(即:它们当前正在与你的数据库执行交易)。但是一旦事务完成,'Connection'将返回到你的池中,'getConnection()'将返回一个有效的'Connection'实例。尽管所有这些将取决于您的游泳池的配置。 – Jeach

回答

2

是的,Apache DBCP可以同时在多线程中工作。当客户端代码getConnection()确保在竞争条件下正确行为时发生“阻止”,例如,一个Connection实例不应被两个并发的getConnection()请求获得。之后,客户端代码处理Connection实例。

并发场景是服务器端池中的主要问题,比如流行的Apache DBCP。所以我认为DBCP在多线程中表现良好,尽管我没有深入研究这个库。

而Apache DBCP只是提供JDBC连接,客户端代码必须使用Connection实例以正确的多线程方式DBCP不能保证。

+0

我不知道我是否正确,但我认为PreparedStatement的连接返回的一些方法是同步的。如果是这样,连接将阻止每个线程... – user1658192

+0

我没有找到'连接'或'语句'中的任何方法在JDBC中同步。 –

+0

因此,在多个线程中使用相同的连接没有问题,每个线程执行不同的查询? – user1658192

4

线程从池中获取连接并独占使用它,直到完成为止,它不共享与其他线程的连接。完成后,它将连接返回到池中(通常连接会覆盖close方法以将其返回到池)。好处是连接不必为每次使用重新创建。但是你不应该有多个线程同时使用数据库连接。

+0

我想避免创建连接线程来提高效率。现在每个线程创建它自己的连接。 – user1658192

+0

@ user1658192为什么不从DBCP数据源调用getConnection()而是共享Connection实例? –

+0

当我调用getConnection()时会发生什么,而同一连接已被其他线程使用?调查是否会创建新的联系? – user1658192