Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring’s embedded H2 datasource and DB_CLOSE_ON_EXIT

Tags:

java

spring

h2

For unit tests (call them integration tests if you want) I have configured an embedded database in my Spring config like so:

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

Now, when running the tests from the command line, they work fine, but I get some errors at the end (harmless, but irritating):

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] 

Now the tip contained in the exception is fine in general, but how do I add this attribute to the embedded datasource? Do I have to expand it, configure it by hand so to speak, to add such ‘advanced’ features?

like image 919
Michael Piefel Avatar asked Mar 25 '13 11:03

Michael Piefel


People also ask

What is H2 embedded database?

H2 is a relational database management system written in Java. It can be embedded in Java applications or run in client-server mode. H2 Database Engine. Initial release.

What is an embedded datasource in spring boot?

H2 is an embedded, open-source, and in-memory database. It is a relational database management system written in Java. It is a client/server application. It stores data in memory, not persist the data on disk.


Video Answer


1 Answers

Specify parameter in JDBC url jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE

Also for in-memory test database I suggest you to add DB_CLOSE_DELAY=-1, like this:

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

To add JDBC connection url to embedded-dababase change it to:

<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> 
like image 87
Michail Nikolaev Avatar answered Sep 19 '22 09:09

Michail Nikolaev