diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/BasicDataSourceFactory.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/BasicDataSourceFactory.java index 9d1142ea947590609b217fe8fcbe51f953a3bd5d..a15e7a8157cf3f24a942426665e2db3ea1c0d650 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/BasicDataSourceFactory.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/BasicDataSourceFactory.java @@ -45,7 +45,7 @@ public class BasicDataSourceFactory implements IDataSourceFactory @Override public final DataSource createDataSource(final String driver, final String url, - final String owner, final String password) + final String owner, final String password, final String validationQuery) { final BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(driver); @@ -55,7 +55,7 @@ public class BasicDataSourceFactory implements IDataSourceFactory dataSource.setMaxIdle(maxIdle); dataSource.setMaxActive(maxActive); dataSource.setMaxWait(maxWait); - dataSource.setValidationQuery("SELECT 1"); + dataSource.setValidationQuery(validationQuery); return dataSource; } diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java index b7580dec6249d1b55c4bfa85a195d27d998834b0..5d2608c64cacb5b2cfb1a0035ab72660d62436ae 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java @@ -131,7 +131,8 @@ public class DatabaseConfigurationContext implements DisposableBean { final String dsDriver = getDriver(); final String url = getDatabaseURL(); - return dataSourceFactory.createDataSource(dsDriver, url, owner, password); + final String validationQuery = getValidationQuery(); + return dataSourceFactory.createDataSource(dsDriver, url, owner, password, validationQuery); } /** @@ -157,6 +158,11 @@ public class DatabaseConfigurationContext implements DisposableBean return databaseEngine.getDriverClass(); } + private final String getValidationQuery() throws ConfigurationFailureException + { + checkDatabaseEngine(); + return databaseEngine.getValidationQuery(); + } /** * Returns user name of the administrator. * @@ -241,7 +247,7 @@ public class DatabaseConfigurationContext implements DisposableBean { adminDataSource = dataSourceFactory.createDataSource(getDriver(), getAdminURL(), getAdminUser(), - getAdminPassword()); + getAdminPassword(), getValidationQuery()); } return adminDataSource; } diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseEngine.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseEngine.java index 01aee99b4f7a6c6fe2d85725d87ad276f1e71917..2f0e46b9f67b354a9bac020de7d73121612eba96 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseEngine.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseEngine.java @@ -21,13 +21,13 @@ import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; -import org.springframework.jdbc.support.lob.LobHandler; import org.springframework.jdbc.support.lob.DefaultLobHandler; +import org.springframework.jdbc.support.lob.LobHandler; import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.common.db.ISequencerHandler; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.db.PostgreSQLSequencerHandler; +import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.dbmigration.h2.H2DAOFactory; import ch.systemsx.cisd.dbmigration.postgresql.PostgreSQLDAOFactory; @@ -40,11 +40,11 @@ public enum DatabaseEngine { POSTGRESQL("postgresql", "org.postgresql.Driver", PostgreSQLDAOFactory.class, new DefaultLobHandler(), new PostgreSQLSequencerHandler(), "jdbc:postgresql:{0}", - "jdbc:postgresql:{0}{1}", "//localhost/", "postgres"), + "jdbc:postgresql:{0}{1}", "//localhost/", "postgres", "SELECT 1"), H2("h2", "org.h2.Driver", H2DAOFactory.class, new DefaultLobHandler(), new PostgreSQLSequencerHandler(), "jdbc:h2:{0}{1};DB_CLOSE_DELAY=-1", - "jdbc:h2:{0}{1};DB_CLOSE_DELAY=-1", "file:db/", "sa"); + "jdbc:h2:{0}{1};DB_CLOSE_DELAY=-1", "file:db/", "sa", null); private static Map<String, DatabaseEngine> engines = initEngineMap(); @@ -68,10 +68,12 @@ public enum DatabaseEngine private final String defaultAdminUser; + private final String validationQuery; + @SuppressWarnings("unchecked") DatabaseEngine(String code, String driver, Class<?> daoFactoryClass, LobHandler lobHandler, ISequencerHandler sequenceHandler, String adminUrlTemplate, String urlTemplate, - String defaultURLHostPart, String defaultAdminUser) + String defaultURLHostPart, String defaultAdminUser, String validationQuery) { assert code != null; assert driver != null; @@ -91,6 +93,7 @@ public enum DatabaseEngine this.driverClass = driver; this.lobHandler = lobHandler; this.sequenceHandler = sequenceHandler; + this.validationQuery = validationQuery; this.daoFactoryClass = (Class<ch.systemsx.cisd.dbmigration.IDAOFactory>) daoFactoryClass; try { @@ -143,8 +146,8 @@ public enum DatabaseEngine } /** - * @param urlHostPartOrNull The host part of the URL, or <code>null</code>, if the default - * host part should be used. + * @param urlHostPartOrNull The host part of the URL, or <code>null</code>, if the default host + * part should be used. * @param databaseName The name of the database (may be ignored for the admin URL, depending on * the database engine) * @return The admin URL of the db. @@ -162,9 +165,14 @@ public enum DatabaseEngine return defaultAdminUser; } + public String getValidationQuery() + { + return validationQuery; + } + /** - * @param urlHostPartOrNull The host part of the URL, or <code>null</code>, if the default - * host part should be used. + * @param urlHostPartOrNull The host part of the URL, or <code>null</code>, if the default host + * part should be used. * @param databaseName The name of the database. * @return The URL of the db. */ diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/IDataSourceFactory.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/IDataSourceFactory.java index b97d14ad809a62c7b1e8df89fa0700924de74c69..11ece668230ee7ed18000ce9a418aa801c7d1e2b 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/IDataSourceFactory.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/IDataSourceFactory.java @@ -31,7 +31,8 @@ public interface IDataSourceFactory /** * Creates a data source for the specified database credentials. */ - public DataSource createDataSource(String driver, String url, String owner, String password); + public DataSource createDataSource(String driver, String url, String owner, String password, + String validationQuery); /** * @see BasicDataSource#setMaxIdle(int) diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SimpleDatabaseConfigurationContext.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SimpleDatabaseConfigurationContext.java index 2a1840fb236e58aaa1225546803f9040fc9b205e..553f02886447684f488f0746dea4853c9934b2af 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SimpleDatabaseConfigurationContext.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SimpleDatabaseConfigurationContext.java @@ -53,6 +53,8 @@ public class SimpleDatabaseConfigurationContext implements DisposableBean static final String MAX_ACTIVE_KEY = "database-max-active"; + static final String VALIDATION_QUERY_KEY = "validation-query"; + private IDataSourceFactory dataSourceFactory = new BasicDataSourceFactory(); private DataSource dataSource; @@ -65,14 +67,17 @@ public class SimpleDatabaseConfigurationContext implements DisposableBean private final String password; + private final String validationQuery; + // for testing public SimpleDatabaseConfigurationContext(String driverClassName, String url, String username, - String password) + String password, String validationQuery) { this.driverClassName = driverClassName; this.url = url; this.username = username; this.password = password; + this.validationQuery = validationQuery; } public SimpleDatabaseConfigurationContext(Properties properties) @@ -95,6 +100,8 @@ public class SimpleDatabaseConfigurationContext implements DisposableBean { dataSourceFactory.setMaxIdle(maxIdle); } + + this.validationQuery = PropertyUtils.getProperty(properties, VALIDATION_QUERY_KEY); } /** @@ -114,7 +121,8 @@ public class SimpleDatabaseConfigurationContext implements DisposableBean */ private final DataSource createDataSource() { - return dataSourceFactory.createDataSource(driverClassName, url, username, password); + return dataSourceFactory.createDataSource(driverClassName, url, username, password, + validationQuery); } /** Closes opened database connections. */ diff --git a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/migration/SqlMigrationDataSourceFactory.java b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/migration/SqlMigrationDataSourceFactory.java index 798540db176b15c99339bfbd4d4c55d9660b65b5..0241cedb19dd478c642a7c6944a34088ebbededc 100644 --- a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/migration/SqlMigrationDataSourceFactory.java +++ b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/migration/SqlMigrationDataSourceFactory.java @@ -8,7 +8,8 @@ public class SqlMigrationDataSourceFactory implements IDataSourceFactory { @Override - public DataSource createDataSource(String driver, String url, String owner, String password) + public DataSource createDataSource(String driver, String url, String owner, String password, + String validationQuery) { return new SqlMigrationDataSource(driver, url, owner, password); }