代码之家  ›  专栏  ›  技术社区  ›  eXtreme

H2数据库不能仅在内存中与文件一起工作

  •  4
  • eXtreme  · 技术社区  · 7 年前

    主应用程序使用PostgreSQL数据库,对于测试,我想使用内存中的H2数据库

    在我尝试访问内存数据库之前,一切都很好

    休眠配置:

    @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";
    ...
    

    问题似乎出在数据库URL上:

    如果我使用:

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

    一切正常。所有测试按其应该的方式运行

    如果我使用:

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

    在这种情况下,我得到

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

     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 ...
    

    等等

    在我看来,在这种情况下,数据库是生成的,不知何故,我正在工作或在另一个实例上,或者发生了什么事情,在创建和测试之间删除了表。

    我在这里发现了类似的问题: H2 in-mem-DB with hibernate set to create giving me table not found errors

    但解决方案是使用文件。

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

    谢谢

    4 回复  |  直到 7 年前
        1
  •  6
  •   gumble42    6 年前

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

    您可以通过在JDBC URL的末尾附加“DB\u CLOSE\u DELAY=-1”来防止数据库关闭,例如。

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

    H2 documentation

        2
  •  1
  •   eXtreme    7 年前

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

    here 可以向数据库url添加显式相对文件路径。

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

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

        3
  •  0
  •   andron    7 年前

    你能显示所有与测试相关的配置文件吗。你有称为“test”的表吗?因为在url中,“.test”表示数据源

    you can find some tips here

        4
  •  0
  •   Harinath    6 年前