diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java index 0d8dd371b8c..341c20ce0a1 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java @@ -57,6 +57,11 @@ public class DataSourceProperties */ private String name = "testdb"; + /** + * If true the database name is randomly generated. + */ + private boolean generateName = false; + /** * Fully qualified name of the connection pool implementation to use. By default, it * is auto-detected from the classpath. @@ -183,6 +188,14 @@ public class DataSourceProperties this.name = name; } + public boolean isGenerateName() { + return this.generateName; + } + + public void setGenerateName(boolean generateName) { + this.generateName = generateName; + } + public Class getType() { return this.type; } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfiguration.java index 60bd9f2c6ce..3ddf04a39fa 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfiguration.java @@ -55,7 +55,13 @@ public class EmbeddedDataSourceConfiguration implements BeanClassLoaderAware { public EmbeddedDatabase dataSource() { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseConnection.get(this.classLoader).getType()); - this.database = builder.setName(this.properties.getName()).build(); + if (this.properties.isGenerateName()) { + builder.generateUniqueName(true); + } + else { + builder.setName(this.properties.getName()); + } + this.database = builder.build(); return this.database; } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfigurationTests.java index fb360aa9f27..5b34ec5b34d 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDataSourceConfigurationTests.java @@ -16,11 +16,17 @@ package org.springframework.boot.autoconfigure.jdbc; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + import javax.sql.DataSource; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.core.env.PropertiesPropertySource; import static org.assertj.core.api.Assertions.assertThat; @@ -42,4 +48,34 @@ public class EmbeddedDataSourceConfigurationTests { this.context.close(); } + @Test + public void generatesUniqueDatabaseName() throws Exception { + Properties myProps = new Properties(); + myProps.setProperty("spring.datasource.generate-name", "true"); + + this.context = new AnnotationConfigApplicationContext(); + this.context.register(EmbeddedDataSourceConfiguration.class); + this.context.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource("whatever", myProps)); + this.context.refresh(); + DataSource dataSource = this.context.getBean(DataSource.class); + assertThat(getDatabaseName(dataSource)).isNotEqualToIgnoringCase("testdb"); + this.context.close(); + } + + private String getDatabaseName(DataSource dataSource) throws SQLException { + Connection connection = dataSource.getConnection(); + try { + ResultSet catalogs = connection.getMetaData().getCatalogs(); + if (catalogs.next()) { + return catalogs.getString(1); + } + else { + throw new IllegalStateException("Unable to get database name"); + } + } + finally { + connection.close(); + } + } + }