0

why not a dupe:

In my opinion this is not a duplicate question because I wasn't looking for solution which is written in the exception itself. I am looking for clarification what really is happening and why is this exception thrown. Linked post doesn't say anything about this.


I want to avoid using "production" database to run tests so I am using in-memory database for testing. I wrote a simple test for dao function and it passes but after finishing every test there is also an exception thrown. This exception doesn't fail any tests but I don't really know what is the reason (it doesn't point to any place in the code I have written) and whether it might lead to any undesired behaviours. Should I ignore it?

Exception:

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-194]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.194.jar:1.4.194]
    at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.194.jar:1.4.194]
    at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.194.jar:1.4.194]
    at org.h2.message.DbException.get(DbException.java:144) ~[h2-1.4.194.jar:1.4.194]
    at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1484) ~[h2-1.4.194.jar:1.4.194]
    at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1459) ~[h2-1.4.194.jar:1.4.194]
    at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:458) ~[h2-1.4.194.jar:1.4.194]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) ~[tomcat-jdbc-8.5.14.jar:na]
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) ~[tomcat-jdbc-8.5.14.jar:na]
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:79) ~[tomcat-jdbc-8.5.14.jar:na]
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) ~[tomcat-jdbc-8.5.14.jar:na]
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81) ~[tomcat-jdbc-8.5.14.jar:na]
    at com.sun.proxy.$Proxy75.getAutoCommit(Unknown Source) ~[na:na]
    at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:34) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.hbm2ddl.DatabaseExporter.<init>(DatabaseExporter.java:35) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:425) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.hbm2ddl.SchemaExport.drop(SchemaExport.java:375) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.tool.hbm2ddl.SchemaExport.drop(SchemaExport.java:371) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.internal.SessionFactoryImpl.close(SessionFactoryImpl.java:1081) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.internal.EntityManagerFactoryImpl.close(EntityManagerFactoryImpl.java:347) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:459) [spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:630) [spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at com.sun.proxy.$Proxy91.close(Unknown Source) [na:na]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.destroy(AbstractEntityManagerFactoryBean.java:550) [spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:272) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:961) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:968) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1033) [spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1009) [spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext$2.run(AbstractApplicationContext.java:928) [spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]

Test:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class ClientDaoTests {

    @Autowired
    private ClientDao clientDao;

    @Test
    public void initTest() {
        assertNotNull(clientDao);
    }

    @Test
    @Transactional
    public void findByEmailTest() {
        assertNull(clientDao.findByEmail("notInDb@mail.com"));
        Client client = new Client("inDb@mail.com", null, null);
        clientDao.save(client);
        assertEquals(client,clientDao.findByEmail(client.getEmail()));
    }
}

application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/foobar
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.username=foo
spring.datasource.password=bar
spring.jpa.hibernate.ddl-auto=create-drop

application-test.properties:

spring.datasource.username=
spring.datasource.password=
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.hibernate.ddl-auto=create-drop
hdw3
  • 871
  • 10
  • 28
  • What about `spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE`? (rtfm) – Joop Eggen Jul 18 '19 at 13:12
  • @JoopEggen I am more looking for clarification what is the reason of this exception than solution. I can put this DB_CLOSE_ON_EXIT=FALSE but I will still not know what has happened. – hdw3 Jul 18 '19 at 13:15
  • You could have a look at [Acolyte](http://acolyte.eu.org/) (I'm a contributor of) which allows to write fully isolated tests for JDBC persistence. – cchantep Jul 19 '19 at 10:27
  • 1
    Per [the H2 documentation](http://www.h2database.com/html/features.html#do_not_close_on_exit), "In some situations, the database should not be closed [when the virtual machine exits]". So it may not an issue with the code you have written, but some automatic process (that expects an existing database) is happening at the end of your test procedure and it is failing because the database has already gone away. Perhaps `spring.jpa.hibernate.ddl-auto=create-drop` trying to drop the schema after the tests are completed. That, of course, is unnecessary for an in-memory database anyway. – Gord Thompson Jul 19 '19 at 23:23

0 Answers0