From b467f2c858aa8039520ef91c1c6488bbe4e70f79 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 30 Sep 2010 17:56:41 +0000 Subject: [PATCH] SPR-7602 - Correctly shutdown Derby >= 10.6 The shutdown mechanism for in-memory databases has changed since 10.6. We now have to trigger 'drop' instead of 'shutdown'. Besides that we can skip purging the database manually in newer versions. --- .../DerbyEmbeddedDatabaseConfigurer.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java index 6b7291cb61..de52d23eb7 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.util.Properties; + import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -42,6 +43,8 @@ final class DerbyEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigure // Error code that indicates successful shutdown private static final String SHUTDOWN_CODE = "08006"; + private static final boolean IS_AT_LEAST_DOT_SIX = new EmbeddedDriver().getMinorVersion() >= 6; + private static final String SHUTDOWN_COMMAND = String.format("%s=true", IS_AT_LEAST_DOT_SIX ? "drop" : "shutdown"); private static DerbyEmbeddedDatabaseConfigurer INSTANCE; @@ -72,15 +75,16 @@ final class DerbyEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigure public void shutdown(DataSource dataSource, String databaseName) { try { - new EmbeddedDriver().connect( - String.format(URL_TEMPLATE, databaseName, "shutdown=true"), new Properties()); - } - catch (SQLException ex) { - if (SHUTDOWN_CODE.equals(ex.getSQLState())) { - purgeDatabase(databaseName); - } - else { + new EmbeddedDriver().connect(String.format(URL_TEMPLATE, databaseName, SHUTDOWN_COMMAND), new Properties()); + } catch (SQLException ex) { + + if (!SHUTDOWN_CODE.equals(ex.getSQLState())) { logger.warn("Could not shutdown in-memory Derby database", ex); + return; + } + + if (!IS_AT_LEAST_DOT_SIX) { + purgeDatabase(databaseName); } } } @@ -99,5 +103,4 @@ final class DerbyEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigure logger.warn("Could not purge in-memory Derby database", ex); } } - }