java.sql.Connection线程安全吗?

时间:2009-10-07 11:35:13

标签: java multithreading jdbc thread-safety dbconnection

重新解释这个问题:我应该避免在不同的线程之间共享实现java.sql.Connection的类的实例吗?

5 个答案:

答案 0 :(得分:65)

如果JDBC驱动程序是规范兼容的,那么技术上是,该对象是线程安全的,但是你应该避免在线程之间共享连接,因为连接上的活动意味着只有一个线程可以做任何事情一次。

您应该使用连接池(如Apache Commons DBCP)来确保每个线程都有自己的连接。

答案 1 :(得分:11)

java.sql.Connection是一个接口。因此,这一切都取决于驱动程序的实现,但通常应避免在不同线程之间共享相同的连接并使用连接池。此外,还建议池中的连接数高于工作线程数。

答案 2 :(得分:3)

这是一个旧线程,但对于那些正在寻找有关Microsoft SQL Server的答案的人来说,答案是:

  

SQLServerConnection不是线程安全的,但是从单个连接创建的多个语句可以在并发线程中同时处理。

  

SQLServerConnection实现与SQL Server的JDBC连接。

综上所述,您可以共享语句而不是Connections,如果您需要在每个线程中建立连接,您可以使用线程池。

了解更多here

答案 3 :(得分:2)

Oracle JDBC and Multithreading文档:

  

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

因此在Oracle情况下可能是安全的,但是并发访问会遇到瓶颈。

答案 4 :(得分:1)

我们在它的pooleddatasource的Websphere语句缓存上有ArrayOutOfBoundsException,我们必须禁用该缓存。

我们有一种阻止自己的治疗方法。

所有这些都是因为当前对连接的访问​​,所以现实生活中的结论是,你不能这样做。