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

时间:2012-02-16 20:36:19

标签: java mysql multithreading jdbc

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

单行上多次读/写的情况怎么样?我应该怎么做呢?我应该用Java创建一个队列,还是MySQL可以处理这种东西?

E.g。我计划使用交易,我将使用以下内容来锁定一行:

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

问题:如果另一个线程进入并希望在第一次提交之前更新同一行,该怎么办?查询是否会失败,或者MySQL会暂时保留它并等待第一个锁被释放?

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

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

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

2 个答案:

答案 0 :(得分:4)

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

希望这有帮助。

PS:

  

如果另一个线程进入并希望更新同一行,该怎么办?   在第一次提交之前?

MySQL将所有UPDATEINSERT保留在缓冲池中。当池足够大时(或在发生特定超时后),缓冲区将刷新到表中。如果在刷新之前执行SELECT,则MySQL将从缓冲区和表中读取信息,以便提供准确的信息。 此例外:未提交的交易。

答案 1 :(得分:0)

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

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

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