我是否需要管理有关数据库访问的并发性?

时间:2014-01-16 21:02:34

标签: java jdbc concurrency h2

我有4个线程以并发方式运行(在数据库中插入/选择行), 我是否必须关心同步访问或H2 Databse已经有机制来管理线程之间的访问?

PS:Connection conn变量在线程之间共享,因此连接是一次,因为我使用嵌入模式,因此只允许一个连接..

干杯。

2 个答案:

答案 0 :(得分:6)

这里有两个可能的问题。一个是连接对象是线程安全的(意味着并发调用不会将对象置于错误状态),另一个是粒度(内置同步是否适合您的需要)。

根据H2's documentation

  

线程安全:连接是线程安全的,因为访问是   同步。但是,为了与其他数据库兼容,a   连接只能在任何时候在一个线程中使用。

就H2而言,同时从多个线程访问连接应该没问题。 (它不会很快,因为线程将排队等待获得连接,但是由于竞争条件导致事情被破坏,连接对象不会遭受某种破坏。)这里的警告是,如果你想要的话要使用与其他数据库相同的代码,你不应该依赖其他数据库的同步,就像H2那样:即使JDBC规范要求连接是线程安全的(可能,我不记得),某些驱动程序可能不是兼容。

此时如果您不关心事务并且只需要自动提交(意味着每个JDBC调用都是单独提交的)那么您就可以了(但是在使用自动提交时关于结果集关闭的注释中看到Mark R的观点)。但是,如果要将多个JDBC调用分组到事务中(将autocommit设置为false并在连接上调用commit),那么您将希望自己管理对连接的访问​​(让线程专门获取连接,运行JDBC语句,然后调用commit,然后释放连接上的锁定,以便您可以控制进入事务的内容。否则,当您在连接上调用commit时,无法确定哪些线程的工作正在提交。

最安全的途径是同步访问整个工作单元。考虑让你的线程排队他们的SQL命令,让它们由一个只能访问连接的专用线程处理。

答案 1 :(得分:1)

DBMS做的每个事务都是原子的。所以如果你有一个连接 由多个theads使用,您可以确保自DBMS以来保存 管理并发。

主要问题是在客户端,意味着您负责处理 也就是服务器的结果集。

以下是我的一些提示:

- Avoid complex queries which take a lot of time
- use the abbility of multiple connections by creating
  independent clients which communicate with the server.
- look at patterns and anti-atterns concenring this issue

希望有所帮助