java.sql.Connection线程安全吗?

Bor*_*vić 61 java multithreading jdbc dbconnection thread-safety

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

ska*_*man 68

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

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

  • 在您引用的Sun JDBC指南语言中,您应该引用最终的粗体句子.我读它是因为他们承认多线程主要是一个失败,每个连接一个线程是当前的期望."在实践中,我们希望大多数JDBC对象只能以单线程方式访问.但是一些多线程支持是必要的,我们在之前的草案中尝试将某些类指定为MT安全而一些类似于MT不安全似乎增加比光更混乱." (22认同)
  • 您的声音可以参考http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec/jdbc-spec.frame9.html,其中显示"我们要求对所有java.sql对象进行所有操作是多线程安全的,能够正确处理多个线程同时调用同一个对象." (11认同)
  • 例如,Postgres的实现不会同步对autoCommit标志的访问,因此它不是线程安全的. (5认同)

And*_*ich 11

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

  • 接口是契约,契约*可以*指定所有实现都必须是线程安全的.只是java.sql.Connection不是这种情况. (7认同)
  • 是的,接口是一个合同,您可以在描述合同的文档中添加一些额外的要求,但正如您所说java.sql.Connection文档没有定义线程安全要求,即使它定义了,仍然是线程安全不是可以严格描述和执行的东西.实施可能仍然违反合同(有时是错误的,有时是设计,例如IdentityHashMap). (2认同)