重新解释这个问题:我应该避免在不同的线程之间共享实现java.sql.Connection
的类的实例吗?
答案 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,我们必须禁用该缓存。
我们有一种阻止自己的治疗方法。
所有这些都是因为当前对连接的访问,所以现实生活中的结论是,你不能这样做。