Java服务器。对 MySQL 的多线程访问。如何管理多个查询?

jim*_*jim 2 java mysql multithreading jdbc

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

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

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

Select <columns> from <table> where <condition> FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)

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

我目前的解决方案:我正在考虑一种方法,它可能是创建所有查询的静态队列/管道,以便一次只将一个提供给数据库。这显然是一个瓶颈和普遍的坏主意?

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

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

Rad*_*zea 5

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

希望这可以帮助。

PS:

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

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