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

标签 java sql database multithreading h2

我正在使用 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/

相关文章:

sql - Postgresql generate_series 的月份

java - 使用结果集将大数据从数据库导出到 Excel

sql - 我如何在 Postgresql 中查询带有标点符号的单词?

java - 使用 tomcat 服务器在 eclipse 中运行 java web 应用程序时系统重新启动

mysql - 如何修改此 SQL 查询

sql - 根据条件 SQL 复制行

mysql - SQL - 无法添加或更新子行 : a foreign key constraint fails - Pivot table

ios - Firebase 数据库中的 PhotoUrl 在 CoverFlow 中显示

java - 在 Linux 上放置 Postgres JDBC 驱动程序 (postgresql-42.1.4.jar) 的正确位置

java - 如何使用字符串生成器在元素之间附加双引号和 'OR'