2009-07-30 66 views
13

标准的MySQL JDBC驱动程序是线程安全的吗?具体而言,我想跨所有线程使用单个连接,但每个语句只能在单个线程中使用。有某些情况是安全的,而其他情况不是?你在这里有什么经验?MySQL Connector/JDBC线程安全吗?

+3

“..虽然你可以在线程之间共享连接(尤其是如果每个线程都有自己的Statement),但这通常不是一个好主意.Java API并不是真正用于线程安全的方式,并且大多数JDBC连接(包括MySQL的)一次只能处理一个查询。“http://forums.mysql.com/read.php?39,171022,171195#msg-171195 – Tim 2009-07-30 22:19:43

+1

@Tim,是的,我之前看过这篇文章。尽管如此,它没有详细讨论任何可能的问题,所以我觉得听到别人的经验会很有趣。另外,我觉得这是一个有效的问题,属于堆栈溢出问题数据库。随意发布该链接作为答案。 :) – 2009-07-30 22:23:07

+1

请考虑使用连接池。 – 2009-07-30 22:32:25

回答

8

每个连接启动/提交事务。除非你正在做一些非常具体的事情(我不能真正想到一个例子,说实话),你最好用连接池和每个线程的连接。

4

如果autocommit = 1,那么让多个线程共享同一个连接是非常可行的,前提是对连接的访问​​是同步的。如果autocommit = 0,则必须通过某种互斥体控制对连接的访问​​,直到提交发生。

除非您的应用程序的连接数量绝对有限,否则连接池可能是更可行的选择。

0

根据我最近的经验,Connection对象在Connector/J 5.1.33中不是线程安全的。

我遇到了bug 67760中描述的死锁情况。不知道是否是一个错误,但在讨论一个合理的建议是:

[2012年12月12日20点33分]托德农民

,请不要使用多个线程 一个连接对象而不适当的同步。连接器/ J - 更重要的是, MySQL客户端 - 服务器协议 - 不允许同时使用相同连接对象的 操作。如果必须跨线程共享Connection对象 ,则应用程序代码作者应负责确保操作正确序列化。