web-dev-qa-db-fra.com

Source de données H2 intégrée de Spring et DB_CLOSE_ON_EXIT

Pour les tests unitaires (appelez-les tests d'intégration si vous le souhaitez), j'ai configuré une base de données intégrée dans ma configuration Spring comme ceci:

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

Maintenant, lors de l'exécution des tests à partir de la ligne de commande, ils fonctionnent bien, mais je reçois des erreurs à la fin (inoffensives, mais irritantes):

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]

Maintenant, l'astuce contenue dans l'exception est très bien en général, mais comment ajouter cet attribut à la source de données incorporée? Dois-je le développer, le configurer à la main pour ainsi dire, pour ajouter de telles fonctionnalités "avancées"?

35
Michael Piefel

Spécifiez le paramètre dans l'URL JDBC jdbc: h2: ~/test; DB_CLOSE_ON_EXIT = FALSE

Aussi pour la base de données de test en mémoire, je vous suggère d'ajouter DB_CLOSE_DELAY=-1, comme ça:

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

Pour ajouter l'URL de connexion JDBC à embedded-dababase changez-le en:

<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
Michail Nikolaev

J'ai eu le même problème que celui de Michael Piefel et j'ai essayé de mettre en œuvre la solution que Michail Nikolaev a expliqué. mais cela n'a pas fonctionné, en quelque sorte au printemps, alors, où sont les tables de métadonnées JOB_ *. Donc, comme la version de spring-jdbc utilisé par mon application est 3.0.5 et augmente le spring-framework on entre en conflit avec dwr (je l'utilise dans mon application) c'est une localisation geo basée sur spring, dwr et gmaps api. J'ai téléchargé le spring-jdbc 4.0.3 relâchez et obtenez-en le H2EmbeddedDatabaseConfigurer.class qui a DB_CLOSE_ON_EXIT=FALSE par défaut et remplacez-le par celui du spring-jdbc 3.0.5 Relâchez et déployez-le dans le fichier war et ça marche, l'arrêt de VM n'a pas provoqué la fermeture de la base de données en mémoire.

J'espère que cette solution inhabituelle aidera si d'autres personnes comme moi ne pourraient pas implémenter l'autre solution.

1
Youssef Kesbaoui