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



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

单元测试将大量数据加载到单个transactions表中(数据库创建时仅包含此表)。有一个线程根据一些定义的处理规则创建、更新和删除行。操作是顺序的,在全速执行时工作良好。

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

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

有人遇到过这个吗?原因是什么?

根据jdbc url,内存模式下的H2可以为每个新连接创建一个新的私有db(例如jdbc:h2:mem:),或者为同一VM中使用相同url的多个连接共享一个db(例如jdbc:h2:mem:db1)。

如果你使用私有db(前)URL,可能是第二个连接正在创建一个新的数据库,它没有由第一个连接创建的表定义?

最新更新