【问题标题】:Java server. Multithread access to MySQL. How to manage multiple queries?Java 服务器。多线程访问 MySQL。如何管理多个查询?
【发布时间】:2012-03-08 06:52:08
【问题描述】:

我目前正在规划一个运行线程池的 Java 服务器,该线程池接受需要进行数据库读取/更新的客户端连接。

在单行上进行多次读取/写入的情况如何?我应该如何管理这个?我应该在 Java 中创建一个队列还是 MySQL 可以处理这种事情?

例如我计划使用事务,我将使用以下内容来锁定一行:

Select <columns> from <table> where <condition> FOR UPDATE;

问题:如果另一个线程进来并想在第一次提交之前更新同一行怎么办?查询会失败还是 MySQL 会保持一段时间并等待第一个锁被释放?

我当前的解决方案:我正在考虑一种方法,可以创建一个包含所有查询的静态队列/管道,以便一次只将一个查询馈送到数据库。这显然是一个瓶颈和一般的坏主意?

另外,是否有任何 Java 框架可以处理这种事情和一般的 MySQL 连接?谢谢。

编辑:我计划使用线程池,因此所有查询都来自单独的连接。

【问题讨论】:

  • 线程是共享一个数据库连接,还是每个线程都有自己的?如果它们是共享的,服务器端锁定将不起作用,因为 MySQL 无法判断它是两个不同的线程在同一个链接上敲击。
  • 在回答之前,必须更好地了解您想要完成的任务:您是否希望线程在同一行排队?为什么要在 SELECT 时锁定行而不是在有效更新时创建锁定?为什么要放弃乐观锁定方法?
  • 我要使用连接池,所以分开连接。
  • @AlessandroSantini 我不知道是否希望线程排队。不确定是否需要。如果我想在更新之前获取用户帐户余额,那么 SELECT FOR UPDATE 方法是一个好方法吗?
  • 我认为这是您首先需要弄清楚的。如果您可能有多个线程同时更新同一个帐户,并且您希望确保所有更新都以先到先得的方式执行,那么 SELECT FOR UPDATE 可能就是您正在寻找的。相反,如果多个线程访问同一个帐户可能会引发错误情况(例如,来自显示过时帐户余额的用户界面的更新),则版本列可能更有效。

标签: java mysql multithreading jdbc


【解决方案1】:

您不必担心多个线程在同一行上读取或写入。 MySQL 会为你解决这个问题。根据表引擎,它会以不同的方式执行此操作,但它总是会执行此操作。如果您可以控制表,我建议使用 InnoDB 引擎,因为它使用行级锁定。这样,它将处理更高的流量。然而,(通常的)替代方案(MyISAM)不支持行级锁定,它使用表锁定。

希望这会有所帮助。

PS:

如果另一个线程进来并想要更新同一行怎么办 在第一次提交之前?

MySQL 将所有UPDATEs 和INSERTs 保存在缓冲池中。当池变得足够大时(或发生特定超时后),缓冲区将刷新到表中。如果在刷新之前执行了SELECT,那么 MySQL 将从缓冲区和表中读取信息,以提供准确的信息。 例外情况:未提交的交易。

【讨论】:

  • 如果我使用 Select from where FOR UPDATE;另一个线程试图写入该行?新的写入查询是否仍会被缓冲,还是会立即失败?
  • @conor 根据 MySQL 文档,除非禁用自动提交(通过将其设置为 0 或通过启动事务),否则您不能执行 SELECT FOR UPDATE。回答您的问题:如果在仍被SELECT FOR UPDATE 锁定的行上发出UPDATE,则UPDATE 将等到SELECT FOR UPDATE 完成并在此之后执行。
【解决方案2】:

首先:并发访问已经由 RDBMS 处理了数十年 :) MySQL 会为您妥善管理这一点,而不必让您对请求进行排队。但是,您可以通过 JDBC 设置各种并发(隔离)级别。

http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#setTransactionIsolation(int)

记录并发的最大问题不是适当的语义,而是数据脏时的用户级通知。但是,如果您只需要确保对记录(行)的正确串行访问,几乎任何数据库都可以很好地处理这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 2015-02-10
    • 1970-01-01
    • 2018-04-28
    • 2011-07-03
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多