Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQL连接器/JDBC线程安全吗?_Java_Mysql_Jdbc_Concurrency_Thread Safety - Fatal编程技术网

Java MySQL连接器/JDBC线程安全吗?

Java MySQL连接器/JDBC线程安全吗?,java,mysql,jdbc,concurrency,thread-safety,Java,Mysql,Jdbc,Concurrency,Thread Safety,标准MySQL JDBC驱动程序是线程安全的吗?具体地说,我希望在所有线程之间使用一个连接,但每个语句将只在一个线程中使用。是否存在某些安全场景和其他不安全场景?您在这里有什么经验?每个连接都会启动/提交事务。除非你在做一些非常具体的事情(老实说,我真的想不出一个可以证明这一点的例子),否则最好使用连接池和每个线程的连接。如果autocommit=1,那么让多个线程共享同一个连接是非常可行的,如果对连接的访问是同步的。如果autocommit=0,则必须通过某种互斥来控制对连接的访问,直到发生提

标准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中修复。