Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果一个线程写一个线程读,H2数据库开始抛出异常_Java_Sql_Database_Multithreading_H2 - Fatal编程技术网

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

Java 如果一个线程写一个线程读,H2数据库开始抛出异常,java,sql,database,multithreading,h2,Java,Sql,Database,Multithreading,H2,我将用作应用程序单元测试的持久层。我使用H2作为内存中的数据库 单元测试将大量数据加载到单个transactions表中(创建数据库时仅包含此表)。有一个线程根据一些定义的处理规则创建、更新和删除行。这些操作是连续的,运行良好,执行速度很快 然后,我添加了另一个线程,该线程从表中读取插入的记录数(这只是一个select count(*)from transactions),以查看我在数据加载中的位置,然后H2开始抛出表\或\视图\未找到\ 1(42102错误代码)的异常。它找不到的表是事务表。我

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

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

然后,我添加了另一个线程,该线程从表中读取插入的记录数(这只是一个
select count(*)from transactions
),以查看我在数据加载中的位置,然后H2开始抛出
表\或\视图\未找到\ 1
(42102错误代码)的异常。它找不到的表是
事务
表。我正在使用一个连接到数据库的两个连接

我知道H2数据库引擎是单线程的,但我的理解是,它为并发操作锁定整个表,这意味着读操作将被写操作阻止,反之亦然,但不会出现这样的愚蠢错误


有人遇到过这种情况吗?原因可能是什么?

根据jdbc url的不同,中的H2可以为每个新连接创建一个新的私有数据库(例如jdbc:H2:mem:),或者为同一虚拟机中使用相同url的多个连接共享的数据库(例如jdbc:H2:mem:db1)


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

在某些配置中,H2会为每个连接创建一个新的数据库,因此它们不会都有表。。。你的配置没有共享,但这可能是罪魁祸首吗?@tariksbl:我不知道。这些是什么配置?实际上这只适用于mem模式,但如果是这样,请参见两个mem url选项。@tariksbl:我确实在内存中使用H2。我在我的问题中添加了这一点,并将尝试看看这是否是问题所在。你介意把你的评论扩展成一个答案吗?