2015-06-12 2 views
1

Я использую h2 встроенную базу данных, которая определяется так:пружинных тестов закрытие встроенных баз несколько раз

<jdbc:embedded-database id="embeddedDatasource" type="h2"/> 

И у меня есть два теста:

@RunWith(SpringJunit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration("classpath:h2-context.xml") 
class Test1 {...} 

@RunWith(SpringJunit4ClassRunner.class) 
@ContextConfiguration("classpath:h2-context.xml") 
class Test2 {...} 

После выполнения всех тестов я видит в журнале:

* Closing org.springframework.context.support.GenericApplicationContext 
* Closing org.springframework.web.context.support.GenericWebApplicationContext 
* Closing JPA EntitiManagerFactory for Persistance unit ... 
* Closing JPA EntitiManagerFactory for Persistance unit ... 

Таким образом, диспетчер объектов закрыт для каждого контекста после выполнения всех тестов. Я знаю, что весна кэширует файлы контекста, поэтому я предполагаю, что h2 bean используется для двух тестов.

Проблема заключается в: иногда я получаю странные исключения, как:

H2EmbeddedDatabaseConfigurer: Could not shutdown embedded database 
jrg.h2.jdbc.JDBCSQLException: The database has been closed [90098-179] 

Как я могу исправить это?

Это то, что я нашел до сих пор: Spring’s embedded H2 datasource and DB_CLOSE_ON_EXIT

+0

вы пытались DB_CLOSE_ON_EXIT? Такая же ошибка? – ikumen

+0

Нет, я этого не делал, и на самом деле это специфично, интересно, какой общий способ решения проблемы. Благодарю. –

+0

Какую версию 'spring-jdbc' (т. Е. Spring Framework в целом) вы используете? –

ответ

4

Поскольку вы используете Spring Framework 3.1.4, вы потенциально видеть результаты столкновения между весной и Н2 и пытаются закрыть базу данных ,

Этот конфликт был рассмотрен в Spring Framework 4.0.3 (см. SPR-11573).

В частности, начиная с Spring 4.0.3, встроенные базы данных H2 создаются с URL-адресом соединения: "jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false". «% S» - это имя базы данных (например, «testdb»).

Таким образом, если вы хотите, чтобы такое же поведение для вашей встроенной базы данных H2 в версиях Spring до 4.0.3, вам необходимо вручную создать DataSource, используя URL-адрес соединения, аналогичный приведенному выше.

Таким образом, менеджер объектов закрыт для каждого контекста после всех тестов . Я знаю, что весна кэширует контекстные файлы, поэтому я думаю, что h2 bean делится на два теста.

Да, Spring Framework TestContext кэша ApplicationContext сек через тесты и тестовые классы. Но ... DataSource для встроенной базы данных H2 - , а не, разделяемой в этих контекстах. Скорее, в описанном выше сценарии вы получаете 2 DataSource s - по одному в каждом контексте и оба ссылаются на одну и ту же базу данных в памяти.

Sooo, теперь, когда я думаю об этом, проблема, с которой вы сталкиваетесь, более вероятно из-за того, что обе ваши ApplicationContext s пытаются закрыть ту же самую базу данных в памяти. Чтобы решить эту проблему, вы можете рассмотреть возможность определения уникального имени встроенной базы данных при каждом ее создании. Для получения дополнительной информации по этой теме, пожалуйста, прочтите следующие вопросы JIRA, которые были решены весной 4.2, но по-прежнему содержат советы о том, как достичь тех же целей до 4.2.

С уважением,

Sam

+0

Удивительный, я думаю, я обновлю весну 4. Спасибо! –

Смежные вопросы