MySQL Connector / JDBC线程安全吗?

时间:2009-07-30 22:12:54

标签: java mysql jdbc concurrency thread-safety

标准MySQL JDBC驱动程序是否是线程安全的?具体来说,我想在所有线程中使用单个连接,但每个语句只能在单个线程中使用。是否存在某些安全的情况,而其他情况则不然?你在这里有什么经历?

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

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

除非您的应用程序可以拥有的连接数量完全受限,否则连接池可能是更可行的替代方案。

答案 2 :(得分:0)

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

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

  

[2012年12月12日20:33] Todd Farmer

     

请不要在多个线程中使用单个Connection对象   没有适当的同步。连接器/ J - 更重要的是,   MySQL客户端 - 服务器协议 - 不允许并发   使用相同Connection对象的操作。如果是Connection对象   必须跨线程共享,这是责任   应用程序代码作者,以确保操作正确序列化。