web-dev-qa-db-ja.com

Springの埋め込みH2データソースとDB_CLOSE_ON_EXIT

単体テスト(必要に応じて統合テストと呼びます)の場合、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]

例外に含まれるヒントは一般的には問題ありませんが、この属性を埋め込みデータソースに追加するにはどうすればよいですか?このような'advanced'機能を追加するには、それを拡張し、いわば手動で設定する必要がありますか?

35
Michael Piefel

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

Michael Piefelの問題と同じ問題があり、Michail Nikolaevが説明したソリューションを実装しようとしました。しかし、それはうまくいきませんでした、どういうわけか春バッチ、そして、メタデータJOB_ *テーブルはどこにありますか。したがって、私のアプリケーションで使用されるspring-jdbcのバージョンは3.0.5であり、spring-frameworkを増やすとdwrと競合するようになります(アプリで使用します)geo春、dwrおよびgmaps apiに基づくローカライズ。 spring-jdbc 4.0.3リリースをダウンロードし、デフォルトでH2EmbeddedDatabaseConfigurer.classを持っているDB_CLOSE_ON_EXIT=FALSEを取得し、warファイルのspring-jdbc 3.0.5 Relaseとdeploy-itにあるものに置き換えますそして、それは機能します。VMのシャットダウンは、メモリ内データベースのクローズを引き起こしませんでした。

私のような他の人が他のソリューションを実装できない場合、この珍しいソリューションが役立つことを願っています。

1