Подтвердить что ты не робот

Spring s встроенный источник данных 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]

Теперь подсказка, содержащаяся в исключении, в общем случае прекрасна, но как добавить этот атрибут во встроенный источник данных? Должен ли я расширять его, настроить его вручную, если можно так выразиться, добавить такие расширенные функции?

4b9b3361

Ответ 1

Укажите параметр в URL JDBC jdbc: h2: ~/test; DB_CLOSE_ON_EXIT = FALSE

Также для тестовой базы данных в памяти я предлагаю вам добавить DB_CLOSE_DELAY=-1, например так:

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

Чтобы добавить URL-адрес JDBC-соединения во 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>

Ответ 2

У меня была та же проблема, что и у Михаила Пифеля, и я пытался реализовать решение, которое объяснил Михаил Николаев. но это не сработало, каким-то образом Spring-Batch, где находятся таблицы метаданных 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, и заменил его на версию Spring spring-jdbc 3.0.5 Relase и развернул его в файле war и работает, выключение VM не провоцирует закрытие базы данных в памяти.

Надеюсь, что это необычное решение поможет, если другие люди, как я, не смогут реализовать другое решение.