From b88bdb37c92f4e5eb5cd833a20f73debc5291211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20Thomas?= Date: Fri, 8 Mar 2019 23:37:41 +0100 Subject: [PATCH] Properly shutdown embedded HSQLDB database on exit --- .../java/org/airsonic/player/Application.java | 6 ++ .../airsonic/player/spring/TerminateBean.java | 55 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 airsonic-main/src/main/java/org/airsonic/player/spring/TerminateBean.java diff --git a/airsonic-main/src/main/java/org/airsonic/player/Application.java b/airsonic-main/src/main/java/org/airsonic/player/Application.java index 25857afe..1b69c429 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/Application.java +++ b/airsonic-main/src/main/java/org/airsonic/player/Application.java @@ -2,6 +2,7 @@ package org.airsonic.player; import net.sf.ehcache.constructs.web.ShutdownListener; import org.airsonic.player.filter.*; +import org.airsonic.player.spring.TerminateBean; import org.directwebremoting.servlet.DwrServlet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,6 +57,11 @@ public class Application extends SpringBootServletInitializer implements Embedde return servlet; } + @Bean + public TerminateBean terminateBean() { + return new TerminateBean(); + } + @Bean public ServletRegistrationBean cxfServletBean() { return new ServletRegistrationBean(new org.apache.cxf.transport.servlet.CXFServlet(), "/ws/*"); diff --git a/airsonic-main/src/main/java/org/airsonic/player/spring/TerminateBean.java b/airsonic-main/src/main/java/org/airsonic/player/spring/TerminateBean.java new file mode 100644 index 00000000..9c6e83f4 --- /dev/null +++ b/airsonic-main/src/main/java/org/airsonic/player/spring/TerminateBean.java @@ -0,0 +1,55 @@ +package org.airsonic.player.spring; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceUtils; + +import javax.annotation.PreDestroy; +import javax.sql.DataSource; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; + +public class TerminateBean { + + private static final Logger LOG = LoggerFactory.getLogger(TerminateBean.class); + + @Autowired + private ApplicationContext context; + + @PreDestroy + public void onDestroy() { + Connection conn = null; + try { + // Connect to the database and retrieve the db name and version + JdbcTemplate jdbcTemplate = new JdbcTemplate(this.context.getBean(DataSource.class)); + conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource()); + DatabaseMetaData meta = conn.getMetaData(); + String productName = meta.getDatabaseProductName(); + int productVersion = meta.getDatabaseMajorVersion(); + + // Properly shutdown HSQLDB databases + if (productName.equals("HSQL Database Engine") && (productVersion == 1 || productVersion == 2)) { + LOG.info("Database shutdown in progress..."); + conn.setAutoCommit(true); + jdbcTemplate.execute("SHUTDOWN"); + LOG.info("Database shutdown complete."); + } + + } catch (SQLException e) { + e.printStackTrace(); + + } finally { + try { + if(conn != null) + conn.close(); + } catch(Exception ex) { + ex.printStackTrace(); + } + } + } +}