【问题标题】:Spring’s embedded H2 datasource and DB_CLOSE_ON_EXITSpring 的嵌入式 H2 数据源和 DB_CLOSE_ON_EXIT
【发布时间】:2013-03-14 20:53:10
【问题描述】:

对于单元测试(如果需要,可以将它们称为集成测试),我在 Spring 配置中配置了一个嵌入式数据库,如下所示:

<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:schema_h2.sql" />
</jdbc:embedded-database>

现在,当从命令行运行测试时,它们工作正常,但最后我得到了一些错误(无害,但令人恼火):

WARN  2013-03-25 12:20:22,656 [Thread-9] o.s.j.d.e.H2EmbeddedDatabaseConfigurer 'Could not shutdown embedded database'
org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-170]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) ~[h2-1.3.170.jar:1.3.170]
    ...
    at org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean.destroy(EmbeddedDatabaseFactoryBean.java:65) [spring-jdbc-3.2.1.RELEASE.jar:3.2.1.RELEASE]
    at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:238) [spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]

现在异常中包含的提示通常很好,但是如何将此属性添加到嵌入式数据源?我是否必须扩展它,可以说是手动配置,添加这样的‘高级’功能?

【问题讨论】:

    标签: java spring h2


    【解决方案1】:

    我遇到了与 Michael Piefel 相同的问题,并尝试实施 Michail Nikolaev 解释的解决方案。 但它不起作用,不知何故spring-batch,然后,元数据JOB_ *表在哪里。 因此,由于我的应用程序使用的spring-jdbc 的版本是3.0.5,并且增加spring-frameworkdwr 冲突(我在我的应用程序中使用它)它是基于spring 的geo 本地化,@ 987654325@ 和gmaps api。 我下载了spring-jdbc 4.0.3 版本并从中获取H2EmbeddedDatabaseConfigurer.class 默认情况下具有DB_CLOSE_ON_EXIT=FALSE 并用它替换spring-jdbc 3.0.5 上的版本并在war 文件中部署它,它可以工作,关闭VM 没有引起内存数据库的关闭。

    如果像我这样的其他人无法实施其他解决方案,希望这个不寻常的解决方案有所帮助。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但这是因为我忘记在我的一个实体上添加注释 @Entity。我添加它,它现在可以工作了! 我希望这对某人有所帮助。

      【讨论】:

        【解决方案3】:

        在JDBC url中指定参数jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE

        对于内存测试数据库,我建议你添加DB_CLOSE_DELAY=-1,像这样:

        jdbc:h2:mem:alm;MODE=Oracle;DB_CLOSE_DELAY=-1
        

        要将 JDBC 连接 url 添加到 embedded-dababase,请将其更改为:

        <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
            <property name="driverClass" value="org.h2.Driver"/>
            <property name="url" value="jdbc:h2:mem:test;MODE=Oracle;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/>
            <property name="username" value="sa"/>
            <property name="password" value=""/>
        </bean>
        
        <jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
            <jdbc:script location="classpath:schema_h2.sql" />
         </jdbc:initialize-database>
        

        【讨论】:

        • 我在 H2 文档中发现了很多。您没有说如何将其添加到&lt;jdbc:embedded-database /&gt;
        • 为了清楚起见,更新后的答案是说它不能与embedded-dababase一起使用?您需要使用数据源 bean 和 initialize-database?
        • 据我了解,url中的mem使h2嵌入
        猜你喜欢
        • 2012-10-22
        • 2018-06-13
        • 1970-01-01
        • 2021-01-07
        • 1970-01-01
        • 2013-02-03
        • 2013-02-05
        • 1970-01-01
        • 2017-03-05
        相关资源
        最近更新 更多