MySQL Connector / JDBC线程安全吗?

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

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

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

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

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

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

[12 Dec 2012 20:33] Todd Farmer

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