diff --git a/build.gradle b/build.gradle index e4ebdd0ce3..78c24f8c48 100644 --- a/build.gradle +++ b/build.gradle @@ -489,8 +489,8 @@ project("spring-jdbc") { optional("c3p0:c3p0:0.9.1.2") optional("org.hsqldb:hsqldb:${hsqldbVersion}") optional("com.h2database:h2:1.0.71") - optional("org.apache.derby:derby:10.5.3.0_1") - optional("org.apache.derby:derbyclient:10.5.3.0_1") + optional("org.apache.derby:derby:10.10.1.1") + optional("org.apache.derby:derbyclient:10.10.1.1") optional("org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1") } } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java index 962b2dff6e..edd7cb0b0a 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/DerbyEmbeddedDatabaseConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,19 +16,16 @@ package org.springframework.jdbc.datasource.embedded; -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; import org.apache.commons.logging.LogFactory; -import org.apache.derby.impl.io.VFMemoryStorageFactory; import org.apache.derby.jdbc.EmbeddedDriver; /** - * {@link EmbeddedDatabaseConfigurer} for the Apache Derby database. + * {@link EmbeddedDatabaseConfigurer} for the Apache Derby database 10.6+. + * Call {@link #getInstance()} to get the singleton instance of this class. * * @author Oliver Gierke * @author Juergen Hoeller @@ -36,19 +33,9 @@ import org.apache.derby.jdbc.EmbeddedDriver; */ final class DerbyEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigurer { - private static final Log logger = LogFactory.getLog(DerbyEmbeddedDatabaseConfigurer.class); - private static final String URL_TEMPLATE = "jdbc:derby:memory:%s;%s"; - // 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; + private static DerbyEmbeddedDatabaseConfigurer instance; /** @@ -57,15 +44,16 @@ final class DerbyEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigure * @throws ClassNotFoundException if Derby is not on the classpath */ public static synchronized DerbyEmbeddedDatabaseConfigurer getInstance() throws ClassNotFoundException { - if (INSTANCE == null) { + if (instance == null) { // disable log file System.setProperty("derby.stream.error.method", OutputStreamFactory.class.getName() + ".getNoopOutputStream"); - INSTANCE = new DerbyEmbeddedDatabaseConfigurer(); + instance = new DerbyEmbeddedDatabaseConfigurer(); } - return INSTANCE; + return instance; } + private DerbyEmbeddedDatabaseConfigurer() { } @@ -81,22 +69,12 @@ final class DerbyEmbeddedDatabaseConfigurer implements EmbeddedDatabaseConfigure public void shutdown(DataSource dataSource, String databaseName) { try { new EmbeddedDriver().connect( - String.format(URL_TEMPLATE, databaseName, SHUTDOWN_COMMAND), new Properties()); + String.format(URL_TEMPLATE, databaseName, "drop=true"), 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) { - // Explicitly purge the in-memory database, to prevent it - // from hanging around after being shut down. - try { - VFMemoryStorageFactory.purgeDatabase(new File(databaseName).getCanonicalPath()); - } - catch (IOException ex2) { - logger.warn("Could not purge in-memory Derby database", ex2); - } + // Error code that indicates successful shutdown + if (!"08006".equals(ex.getSQLState())) { + LogFactory.getLog(getClass()).warn("Could not shutdown in-memory Derby database", ex); } } } diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseBuilderTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseBuilderTests.java index 8ad40961bf..a3983c2583 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseBuilderTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,11 @@ package org.springframework.jdbc.datasource.embedded; import org.junit.Test; + import org.springframework.core.io.ClassRelativeResourceLoader; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.init.CannotReadScriptException; -import org.springframework.tests.Assume; -import org.springframework.tests.TestGroup; import static org.junit.Assert.*; @@ -36,6 +35,9 @@ public class EmbeddedDatabaseBuilderTests { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); EmbeddedDatabase db = builder.addDefaultScripts().build(); assertDatabaseCreatedAndShutdown(db); + + db = builder.addDefaultScripts().build(); + assertDatabaseCreatedAndShutdown(db); } @Test @@ -43,6 +45,9 @@ public class EmbeddedDatabaseBuilderTests { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(new ClassRelativeResourceLoader(getClass())); EmbeddedDatabase db = builder.addScript("db-schema.sql").addScript("db-test-data.sql").build(); assertDatabaseCreatedAndShutdown(db); + + db = builder.addScript("db-schema.sql").addScript("db-test-data.sql").build(); + assertDatabaseCreatedAndShutdown(db); } @Test @@ -50,6 +55,9 @@ public class EmbeddedDatabaseBuilderTests { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(new ClassRelativeResourceLoader(getClass())); EmbeddedDatabase db = builder.addScript("db-schema-comments.sql").addScript("db-test-data.sql").build(); assertDatabaseCreatedAndShutdown(db); + + db = builder.addScript("db-schema-comments.sql").addScript("db-test-data.sql").build(); + assertDatabaseCreatedAndShutdown(db); } @Test @@ -57,15 +65,19 @@ public class EmbeddedDatabaseBuilderTests { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(new ClassRelativeResourceLoader(getClass())); EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.H2).addScript("db-schema.sql").addScript("db-test-data.sql").build(); assertDatabaseCreatedAndShutdown(db); + + db = builder.setType(EmbeddedDatabaseType.H2).addScript("db-schema.sql").addScript("db-test-data.sql").build(); + assertDatabaseCreatedAndShutdown(db); } @Test public void testBuildDerby() { - Assume.group(TestGroup.LONG_RUNNING); - EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(new ClassRelativeResourceLoader(getClass())); EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.DERBY).addScript("db-schema-derby.sql").addScript("db-test-data.sql").build(); assertDatabaseCreatedAndShutdown(db); + + db = builder.setType(EmbeddedDatabaseType.DERBY).addScript("db-schema-derby-with-drop.sql").addScript("db-test-data.sql").build(); + assertDatabaseCreatedAndShutdown(db); } @Test diff --git a/spring-jdbc/src/test/resources/org/springframework/jdbc/datasource/embedded/db-schema-derby-with-drop.sql b/spring-jdbc/src/test/resources/org/springframework/jdbc/datasource/embedded/db-schema-derby-with-drop.sql new file mode 100644 index 0000000000..ffae480233 --- /dev/null +++ b/spring-jdbc/src/test/resources/org/springframework/jdbc/datasource/embedded/db-schema-derby-with-drop.sql @@ -0,0 +1,3 @@ +drop table T_TEST; + +create table T_TEST (NAME varchar(50) not null); \ No newline at end of file