Java MySQL连接器/JDBC线程安全吗?
标准MySQL JDBC驱动程序是线程安全的吗?具体地说,我希望在所有线程之间使用一个连接,但每个语句将只在一个线程中使用。是否存在某些安全场景和其他不安全场景?您在这里有什么经验?每个连接都会启动/提交事务。除非你在做一些非常具体的事情(老实说,我真的想不出一个可以证明这一点的例子),否则最好使用连接池和每个线程的连接。如果autocommit=1,那么让多个线程共享同一个连接是非常可行的,如果对连接的访问是同步的。如果autocommit=0,则必须通过某种互斥来控制对连接的访问,直到发生提交为止Java MySQL连接器/JDBC线程安全吗?,java,mysql,jdbc,concurrency,thread-safety,Java,Mysql,Jdbc,Concurrency,Thread Safety,标准MySQL JDBC驱动程序是线程安全的吗?具体地说,我希望在所有线程之间使用一个连接,但每个语句将只在一个线程中使用。是否存在某些安全场景和其他不安全场景?您在这里有什么经验?每个连接都会启动/提交事务。除非你在做一些非常具体的事情(老实说,我真的想不出一个可以证明这一点的例子),否则最好使用连接池和每个线程的连接。如果autocommit=1,那么让多个线程共享同一个连接是非常可行的,如果对连接的访问是同步的。如果autocommit=0,则必须通过某种互斥来控制对连接的访问,直到发生提
除非您的应用程序可以拥有的连接数量受到绝对限制,否则连接池可能是更可行的选择。根据我最近的经验,
connection
对象在Connector/J 5.1.33中不是线程安全的
我遇到了中描述的僵局情况。不确定这是否是一个bug,但讨论中的一个合理建议是:
[2012年12月12日20:33]托德·法默
请不要跨多个线程使用单个连接对象
没有适当的同步。接头/J-更重要的是,
MySQL客户端-服务器协议-不允许并发
使用相同连接对象的操作。如果一个连接对象
必须跨线程共享,这是
应用程序代码作者,以确保操作正确序列化
“。虽然您可以跨线程共享连接(特别是在每个线程都有自己的语句的情况下),但这通常不是一个好主意。JDBC API并不是真正设计为以线程安全的方式使用的,大多数JDBC连接(包括MySQL)一次只能处理一个查询…”Tim,是的,我之前看过这篇文章。但它没有详细说明任何可能的问题,所以我觉得听听其他人的经历会很有趣。另外,我觉得这是一个属于堆栈溢出问题数据库的有效问题。请随意将该链接作为答案发布。:)请考虑使用连接池。我想知道是否可能有一个可能的用例,在这里你想要做某种叉/连接算法(C.F.),但完全在一个事务中,这样你就可以打开连接并在起始线程中启动事务。将此消息传递给所有任务执行者,然后在所有连接完成后在原始线程中提交?例如:使用
加载数据本地填充
将流数据插入到多个表中,其中数据具有相互关系,并且不能廉价地重复两次。仅供参考,该错误现在已在5.1.37中修复。