繁体   English   中英

H2数据库仅在文件中无法在内存中工作

[英]H2 database doesn't work in memory only with file

我有一个与Hibernate一起建立的Spring MVC项目,并想为某些服务创建一些测试。 主应用程序使用PostgreSQL数据库,并且对于测试,我想在内存数据库中使用H2

我为测试创建了单独的配置文件(Spring和Hibernate),一切正常,直到尝试访问内存数据库为止

休眠配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("<repository>")
public class DataSourceTestConfig {

private static final Logger LOG = LogManager.getLogger(DataSourceTestConfig.class);

private static final String DATABASE_DRIVER = "org.h2.Driver";
//private static final String DATABASE_URL = "jdbc:h2:file:d:/test";
private static final String DATABASE_URL = "jdbc:h2:mem:test";
private static final String DATABASE_USERNAME = "sa";
private static final String DATABASE_PASSWORD = "";

private static final String HIBERNATE_DIALECT = "org.hibernate.dialect.H2Dialect";
private static final String HIBERNATE_SHOW_SQL = "true";
private static final String ENTITYMANAGER_PACKAGES_TO_SCAN = "<packages>";
private static final String HIBERNATE_HBM2DDL_AUTO = "create";
...

问题似乎出在DATABASE_URL:

如果我使用:

DATABASE_URL = "jdbc:h2:file:d:/test";

一切正常。 所有测试均按预期运行

如果我使用:

DATABASE_URL = "jdbc:h2:mem:test";

所有的地狱都打破了,它不起作用:)

在这种情况下

 org.h2.jdbc.JdbcSQLException: Table "test" not found; SQL statement: ...

通过查看Hibernate日志,可以清楚地看到该表实际上是生成的:

 DEBUG org.hibernate.SQL - drop table test if exists
 ...
 DEBUG org.hibernate.SQL - create table test (<columns>)
 ...
 DEBUG org.hibernate.SQL - alter table test add constraint FKg74a38x6t762qifuge9cux03i foreign key ...

等等 ...

在我看来,在这种情况下,数据库已经生成,并且以某种方式我正在工作或在其他实例上工作,或者发生了某些事情,并且在创建和测试之间删除了表。

在我看来,这些情况似乎不太可能,因为没有Hibernate日志指示此情况(无丢弃查询),测试日志在创建日志后立即开始

我在这里发现了类似的问题: H2在内存数据库中设置了休眠模式,以创建给我的表未找到错误

但是那里的解决方案是使用文件。

这不是我的解决方案,因为这些测试必须在运行不同操作系统的许多计算机上执行,因此硬编码路径文件不是一个选择。 而且JDBC不允许相对路径,因此我可以将数据库文件放在resources文件夹中。

有谁知道如何解决这个问题?

谢谢。

我遇到了同样的问题,最终找到了解决方案:这是因为在初始化数据库之后,它再次关闭。 但是,使用标准设置,这将导致删除数据库。 当您在测试中再次连接相同的URL时,您将拥有一个“新”实例,其中包含所有创建的表。

您可以通过在JDBC URL的末尾附加“; DB_CLOSE_DELAY = -1”来防止关闭数据库。例如

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

H2文档提供了有关这些设置的更多详细信息。

您可以显示与测试相关的所有配置文件吗? 您是否有一个名为“ test”的表,因为在URL中“ ..test”表示数据源

您可以在这里找到一些提示

最后,我没有使用内存数据库,而是使用了一个文件。

如此处所述可以向数据库url添加一个明确的相对文件路径。

我最终要做的是将DATABASE_URL设置为:

 DATABASE_URL = "jdbc:h2:file:./src/test/resources/test";

这将在resources文件夹中创建一个数据库文件,这是完全可以接受的。

用数据库名称创建一个文件。 示例:test.h2.db

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM