如果一个线程写入并且一个读取,H2数据库开始抛出异常

时间:2014-05-11 15:46:22

标签: java sql database multithreading h2

我正在使用H2 database作为单元测试应用程序的持久层。我正在使用H2作为内存数据库。

单元测试将大量数据加载到单个transactions表中(创建数据库时只包含此表)。有一个线程可以根据一些已定义的处理规则创建,更新和删除行。这些操作是连续的,并且在完全执行速度下运行良好。

然后我添加了另一个线程,从表中读取插入的记录数(它只是一个select count(*) from transactions),以查看我对数据加载的位置,H2开始吐出异常{ {1}}(42102错误代码)。它找不到的表是TABLE_OR_VIEW_NOT_FOUND_1表。我正在使用JdbcConnectionPool来获取与数据库的两个连接。

我知道H2数据库引擎是单线程的,但我的理解是它锁定了整个表以进行并发操作,这意味着读取将被写入阻止,反之则不会得到像这样的愚蠢错误。

有没有人遇到过这个?可能是什么原因?

1 个答案:

答案 0 :(得分:2)

根据jdbc url,in-memory mode中的H2可以为每个新连接(ex jdbc:h2:mem:)创建一个新的私有db,或者使用相同的URL在同一VM中的多个连接共享一个db (前jdbc:h2:mem:db1)。

如果您正在使用私有db(以前的)URL,那么第二个连接可能是创建了一个没有第一个连接创建的表定义的新数据库吗?