Browse Source

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.
pull/1234/head
Oliver Gierke 15 years ago
parent
commit
b467f2c858
  1. 21
      org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java

21
org.springframework.jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java

@ -20,6 +20,7 @@ import java.io.File; @@ -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 @@ -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 @@ -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 @@ -99,5 +103,4 @@ final class DerbyEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigure
logger.warn("Could not purge in-memory Derby database", ex);
}
}
}

Loading…
Cancel
Save