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