我使用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,可能是第二个连接正在创建一个新的数据库,它没有由第一个连接创建的表定义?