10

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

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

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

如果它阻塞,我可以使用其他东西吗?

更新

在这篇文章中:链接 说:

因为所有 Oracle JDBC API 方法都是同步的,如果两个线程尝试同时使用连接对象,那么一个线程将被迫等待,直到另一个线程完成使用。

所以我猜 DBCP 将无法处理这个问题?

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

4

2 回答 2

4

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

于 2012-09-11T15:05:29.547 回答
2

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

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

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

于 2012-09-09T14:13:53.150 回答