【问题标题】:Is MySQL Connector/JDBC thread safe?MySQL 连接器/JDBC 线程安全吗?
【发布时间】:2010-11-15 15:10:42
【问题描述】:

标准的 MySQL JDBC 驱动程序是线程安全的吗?具体来说,我想在所有线程中使用单个连接,但每个语句只会在单个线程中使用。是否存在某些安全的场景和其他不安全的场景?您在这里有什么经验?

【问题讨论】:

  • "..虽然您可以跨线程共享连接(特别是如果每​​个线程都有自己的语句),这通常不是一个好主意。JDBC API 不是真的旨在以线程安全的方式使用,大多数 JDBC 连接(包括 MySQL 的)一次只能处理一个查询。" forums.mysql.com/read.php?39,171022,171195#msg-171195
  • @Tim,是的,我之前看到了这个帖子。虽然它没有详细介绍任何可能的问题,所以我觉得听听其他人的经历会很有趣。另外,我觉得这是一个属于堆栈溢出问题数据库的有效问题。随意发布该链接作为答案。 :)
  • 考虑改用连接池。

标签: java mysql jdbc concurrency thread-safety


【解决方案1】:

每个连接都会启动/提交事务。除非您正在做一些非常具体的事情(我真的想不出一个可以说实话的例子),否则最好使用连接池和每个线程的连接。

【讨论】:

  • 我想知道是否有一个可能的用例,你想做某种 fork/join 算法(cf ibm.com/developerworks/java/library/j-jtp11137.html)但完全在一个事务中,所以你可以打开一个连接并开始发起线程中的事务,将其传递给所有任务执行者,然后在所有加入完成后在发起线程中提交?
  • 示例:使用load data local infile将流式数据插入到多个表中,其中数据具有相互关系,并且不能廉价地迭代两次。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    [2012 年 12 月 12 日 20:33] 托德·法默

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

    【讨论】:

    • 仅供参考,该错误现在应该在 5.1.37 中修复。
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多