java.sql.Connection 线程安全吗?
重新表述一下这个问题:我应该避免在不同线程之间共享实现 java.sql.Connection 的类的实例吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
重新表述一下这个问题:我应该避免在不同线程之间共享实现 java.sql.Connection 的类的实例吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
如果 JDBC 驱动程序符合规范,那么从技术上讲,该对象是线程安全的,但您应该避免在线程之间共享连接,因为连接上的活动意味着一次只有一个线程能够执行任何操作。
您应该使用连接池(例如 Apache Commons DBCP)来确保每个线程都获得它自己的连接。
If the JDBC driver is spec-compliant, then technically yes, the object is thread-safe, but you should avoid sharing connections between threads, since the activity on the connection will mean that only one thread will be able to do anything at a time.
You should use a connection pool (like Apache Commons DBCP) to ensure that each thread gets its own connection.
java.sql.Connection 是一个接口。因此,这一切都取决于驱动程序的实现,但通常您应该避免在不同线程之间共享相同的连接并使用连接池。此外,还建议池中的连接数高于工作线程数。
java.sql.Connection is an interface. So, it all depends on the driver's implementation, but in general you should avoid sharing the same connection between different threads and use connection pools. Also it is also advised to have number of connections in the pool higher than number of worker threads.
Oracle JDBC 和多线程 文档:
因此在 Oracle 情况下可能是安全的,但并发访问会遇到瓶颈。
Oracle JDBC and Multithreading docs:
So it may be safe in Oracle case but concurrent access would suffer from bottleneck.
这是一个相当古老的线程,但对于那些正在寻找有关 Microsoft SQL Server 的答案的人来说,这里是答案:
和
综上所述,您可以共享语句,但不能共享连接,如果每个线程都需要一个连接,则可以使用线程池。
了解更多这里
This is rather an old thread, but for those who are looking for an answer regarding Microsoft SQL Server, here is the answer:
and
From all the above, you can share statements but not Connections, and in case you need a connection in each thread, you may use a thread pool.
Read more here
我们在其池化数据源的 Websphere 语句缓存上遇到了 ArrayOutOfBoundsException,我们必须禁用该缓存。
我们的治疗方法是自我封闭的。
所有这些都是因为当前可以访问连接,因此现实生活实践得出的结论是,您一定不能这样做。
We had ArrayOutOfBoundsException on the Websphere statement cache of it's pooleddatasource, and we had to disable that cache.
We had a treatment that was blocking itself.
All of that because of current access to the connection, so the conclusion by real life practice, is that you must not do that.