我正在使用 H2 database作为对应用程序进行单元测试的持久层。我使用 H2 作为内存数据库。
单元测试将大量数据加载到单个 transactions
表中(创建的数据库中只有这个表)。有一个线程根据一些定义的处理规则创建、更新和删除行。这些操作是按顺序进行的,运行良好,执行速度极快。
然后我添加了另一个线程,从表中读取插入的记录数(它只是一个select count(*) from transactions
)以查看我在数据加载时的位置H2 开始吐出异常 TABLE_OR_VIEW_NOT_FOUND_1
(42102 错误代码)。它找不到的表是 transactions
表。我正在使用 JdbcConnectionPool获得到数据库的两个连接。
我知道 H2 数据库引擎是单线程的,但我的理解是它会锁定整个表以进行并发操作,这意味着读取将被写入阻塞,反之亦然,但不会出现那样的愚蠢错误。
有人遇到过吗?可能是什么原因?
最佳答案
根据 jdbc url,in-memory mode 中的 H2可以为每个新连接创建一个新的私有(private)数据库(例如 jdbc:h2:mem:
),或者由同一 VM 中使用相同 URL 的许多连接共享的数据库(例如 jdbc:h2 :mem:db1
).
如果您使用的是私有(private)数据库(以前的)URL,可能是第二个连接正在创建一个没有第一个连接创建的表定义的新数据库?
关于java - 如果一个线程写入一个读取,H2 数据库开始抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23594656/