Repository: commons-dbcp Updated Branches: refs/heads/master 35a456bb6 -> a0c48c1e1
[DBCP-479] Support default schema in configuration. Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/a0c48c1e Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/a0c48c1e Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/a0c48c1e Branch: refs/heads/master Commit: a0c48c1e155462c2851b41eb7aa707f310516411 Parents: 35a456b Author: Gary Gregory <garydgreg...@gmail.com> Authored: Mon Jun 18 16:16:09 2018 -0600 Committer: Gary Gregory <garydgreg...@gmail.com> Committed: Mon Jun 18 16:16:09 2018 -0600 ---------------------------------------------------------------------- src/changes/changes.xml | 3 ++ .../apache/commons/dbcp2/BasicDataSource.java | 39 ++++++++++++++++++++ .../commons/dbcp2/BasicDataSourceFactory.java | 28 ++++++++------ .../commons/dbcp2/BasicDataSourceMXBean.java | 10 +++++ .../dbcp2/PoolableConnectionFactory.java | 15 ++++++++ .../dbcp2/managed/BasicManagedDataSource.java | 1 + .../commons/dbcp2/TestBasicDataSource.java | 9 ++++- .../dbcp2/TestBasicDataSourceFactory.java | 11 +++--- .../apache/commons/dbcp2/TesterConnection.java | 7 +++- 9 files changed, 103 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 62c845b..1224770 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -67,6 +67,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="update" issue="DBCP-506" due-to="Gary Gregory"> Support JDBC 4.2. </action> + <action dev="ggregory" type="update" issue="DBCP-479" due-to="Guillaume Husta, Gary Gregory"> + Support default schema in configuration. + </action> </release> <release version="2.4.0" date="2018-06-12" description="This is a minor release, including bug fixes and enhancements."> <action dev="ggregory" type="fix" issue="DBCP-484" due-to="Emanuel Freitas"> http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java b/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java index d940e7e..8d08509 100644 --- a/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java +++ b/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java @@ -224,6 +224,11 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean private volatile String defaultCatalog; /** + * The default "schema" of connections created by this pool. + */ + private volatile String defaultSchema; + + /** * Returns the default catalog. * * @return the default catalog @@ -234,6 +239,17 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean } /** + * Returns the default schema. + * + * @return the default schema. + * @since 2.5.0 + */ + @Override + public String getDefaultSchema() { + return this.defaultSchema; + } + + /** * <p> * Sets the default catalog. * </p> @@ -255,6 +271,28 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean } /** + * <p> + * Sets the default schema. + * </p> + * <p> + * Note: this method currently has no effect once the pool has been initialized. The pool is initialized the first + * time one of the following methods is invoked: <code>getConnection, setLogwriter, + * setLoginTimeout, getLoginTimeout, getLogWriter.</code> + * </p> + * + * @param defaultSchema + * the default catalog + * @since 2.5.0 + */ + public void setDefaultSchema(final String defaultSchema) { + if (defaultSchema != null && defaultSchema.trim().length() > 0) { + this.defaultSchema = defaultSchema; + } else { + this.defaultSchema = null; + } + } + + /** * The property that controls if the pooled connections cache some state rather than query the database for current * state to improve performance. */ @@ -2317,6 +2355,7 @@ public class BasicDataSource implements DataSource, BasicDataSourceMXBean, MBean connectionFactory.setDefaultAutoCommit(defaultAutoCommit); connectionFactory.setDefaultTransactionIsolation(defaultTransactionIsolation); connectionFactory.setDefaultCatalog(defaultCatalog); + connectionFactory.setDefaultSchema(defaultSchema); connectionFactory.setCacheState(cacheState); connectionFactory.setPoolStatements(poolPreparedStatements); connectionFactory.setMaxOpenPreparedStatements(maxOpenPreparedStatements); http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java index 69c2cb9..959aecf 100644 --- a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java +++ b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java @@ -63,6 +63,7 @@ public class BasicDataSourceFactory implements ObjectFactory { private static final String PROP_DEFAULTREADONLY = "defaultReadOnly"; private static final String PROP_DEFAULTTRANSACTIONISOLATION = "defaultTransactionIsolation"; private static final String PROP_DEFAULTCATALOG = "defaultCatalog"; + private static final String PROP_DEFAULTSCHEMA = "defaultSchema"; private static final String PROP_CACHESTATE = "cacheState"; private static final String PROP_DRIVERCLASSNAME = "driverClassName"; private static final String PROP_LIFO = "lifo"; @@ -130,17 +131,17 @@ public class BasicDataSourceFactory implements ObjectFactory { private static final String SILENTPROP_AUTH = "auth"; private static final String[] ALL_PROPERTIES = {PROP_DEFAULTAUTOCOMMIT, PROP_DEFAULTREADONLY, - PROP_DEFAULTTRANSACTIONISOLATION, PROP_DEFAULTCATALOG, PROP_CACHESTATE, PROP_DRIVERCLASSNAME, PROP_LIFO, - PROP_MAXTOTAL, PROP_MAXIDLE, PROP_MINIDLE, PROP_INITIALSIZE, PROP_MAXWAITMILLIS, PROP_TESTONCREATE, - PROP_TESTONBORROW, PROP_TESTONRETURN, PROP_TIMEBETWEENEVICTIONRUNSMILLIS, PROP_NUMTESTSPEREVICTIONRUN, - PROP_MINEVICTABLEIDLETIMEMILLIS, PROP_SOFTMINEVICTABLEIDLETIMEMILLIS, PROP_EVICTIONPOLICYCLASSNAME, - PROP_TESTWHILEIDLE, PROP_PASSWORD, PROP_URL, PROP_USERNAME, PROP_VALIDATIONQUERY, - PROP_VALIDATIONQUERY_TIMEOUT, PROP_CONNECTIONINITSQLS, PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED, - PROP_REMOVEABANDONEDONBORROW, PROP_REMOVEABANDONEDONMAINTENANCE, PROP_REMOVEABANDONEDTIMEOUT, - PROP_LOGABANDONED, PROP_ABANDONEDUSAGETRACKING, PROP_POOLPREPAREDSTATEMENTS, PROP_MAXOPENPREPAREDSTATEMENTS, - PROP_CONNECTIONPROPERTIES, PROP_MAXCONNLIFETIMEMILLIS, PROP_LOGEXPIREDCONNECTIONS, PROP_ROLLBACK_ON_RETURN, - PROP_ENABLE_AUTOCOMMIT_ON_RETURN, PROP_DEFAULT_QUERYTIMEOUT, PROP_FASTFAIL_VALIDATION, - PROP_DISCONNECTION_SQL_CODES, PROP_JMX_NAME }; + PROP_DEFAULTTRANSACTIONISOLATION, PROP_DEFAULTCATALOG, PROP_DEFAULTSCHEMA, PROP_CACHESTATE, + PROP_DRIVERCLASSNAME, PROP_LIFO, PROP_MAXTOTAL, PROP_MAXIDLE, PROP_MINIDLE, PROP_INITIALSIZE, + PROP_MAXWAITMILLIS, PROP_TESTONCREATE, PROP_TESTONBORROW, PROP_TESTONRETURN, + PROP_TIMEBETWEENEVICTIONRUNSMILLIS, PROP_NUMTESTSPEREVICTIONRUN, PROP_MINEVICTABLEIDLETIMEMILLIS, + PROP_SOFTMINEVICTABLEIDLETIMEMILLIS, PROP_EVICTIONPOLICYCLASSNAME, PROP_TESTWHILEIDLE, PROP_PASSWORD, + PROP_URL, PROP_USERNAME, PROP_VALIDATIONQUERY, PROP_VALIDATIONQUERY_TIMEOUT, PROP_CONNECTIONINITSQLS, + PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED, PROP_REMOVEABANDONEDONBORROW, PROP_REMOVEABANDONEDONMAINTENANCE, + PROP_REMOVEABANDONEDTIMEOUT, PROP_LOGABANDONED, PROP_ABANDONEDUSAGETRACKING, PROP_POOLPREPAREDSTATEMENTS, + PROP_MAXOPENPREPAREDSTATEMENTS, PROP_CONNECTIONPROPERTIES, PROP_MAXCONNLIFETIMEMILLIS, + PROP_LOGEXPIREDCONNECTIONS, PROP_ROLLBACK_ON_RETURN, PROP_ENABLE_AUTOCOMMIT_ON_RETURN, + PROP_DEFAULT_QUERYTIMEOUT, PROP_FASTFAIL_VALIDATION, PROP_DISCONNECTION_SQL_CODES, PROP_JMX_NAME }; /** * Obsolete properties from DBCP 1.x. with warning strings suggesting new properties. LinkedHashMap will guarantee @@ -337,6 +338,11 @@ public class BasicDataSourceFactory implements ObjectFactory { dataSource.setDefaultCatalog(value); } + value = properties.getProperty(PROP_DEFAULTSCHEMA); + if (value != null) { + dataSource.setDefaultSchema(value); + } + value = properties.getProperty(PROP_CACHESTATE); if (value != null) { dataSource.setCacheState(Boolean.valueOf(value).booleanValue()); http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java index 4693c88..4754764 100644 --- a/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java +++ b/src/main/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java @@ -59,6 +59,16 @@ public interface BasicDataSourceMXBean { String getDefaultCatalog(); /** + * See {@link BasicDataSource#getDefaultSchema()} + * + * @return {@link BasicDataSource#getDefaultSchema()} + * @since 2.5.0 + */ + default String getDefaultSchema() { + return null; + } + + /** * See {@link BasicDataSource#getCacheState()} * * @return {@link BasicDataSource#getCacheState()} http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java b/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java index 9ff815b..ad932bc 100644 --- a/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java +++ b/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java @@ -157,6 +157,17 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo this.defaultCatalog = defaultCatalog; } + /** + * Sets the default "schema" setting for borrowed {@link Connection}s + * + * @param defaultSchema + * the default "schema" setting for borrowed {@link Connection}s + * @since 2.5.0 + */ + public void setDefaultSchema(final String defaultSchema) { + this.defaultSchema = defaultSchema; + } + public void setCacheState(final boolean cacheState) { this.cacheState = cacheState; } @@ -427,6 +438,9 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo if (defaultCatalog != null && !defaultCatalog.equals(conn.getCatalog())) { conn.setCatalog(defaultCatalog); } + if (defaultSchema != null && !defaultSchema.equals(conn.getSchema())) { + conn.setSchema(defaultSchema); + } conn.setDefaultQueryTimeout(defaultQueryTimeoutSeconds); } @@ -478,6 +492,7 @@ public class PoolableConnectionFactory implements PooledObjectFactory<PoolableCo private boolean rollbackOnReturn = true; private int defaultTransactionIsolation = UNKNOWN_TRANSACTIONISOLATION; private String defaultCatalog; + private String defaultSchema; private boolean cacheState; private boolean poolStatements; private int maxOpenPreparedStatements = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY; http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java index 329c0bd..723c621 100644 --- a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java +++ b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java @@ -207,6 +207,7 @@ public class BasicManagedDataSource extends BasicDataSource { connectionFactory.setDefaultAutoCommit(getDefaultAutoCommit()); connectionFactory.setDefaultTransactionIsolation(getDefaultTransactionIsolation()); connectionFactory.setDefaultCatalog(getDefaultCatalog()); + connectionFactory.setDefaultSchema(getDefaultSchema()); connectionFactory.setCacheState(getCacheState()); connectionFactory.setPoolStatements(isPoolPreparedStatements()); connectionFactory.setMaxOpenPreparedStatements(getMaxOpenPreparedStatements()); http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java index 595d7e9..b1550b4 100644 --- a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java +++ b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java @@ -463,7 +463,9 @@ public class TestBasicDataSource extends TestConnectionPool { StackMessageLog.clear(); ds.close(); // Exception must have been swallowed by the pool - verify it is logged - assertTrue(StackMessageLog.popMessage().indexOf("bang") > 0); + final String message = StackMessageLog.popMessage(); + Assert.assertNotNull(message); + assertTrue(message.indexOf("bang") > 0); } catch (final SQLException ex) { assertTrue(ex.getMessage().indexOf("Cannot close") > 0); assertTrue(ex.getCause().getMessage().indexOf("bang") > 0); @@ -484,7 +486,9 @@ public class TestBasicDataSource extends TestConnectionPool { StackMessageLog.lock(); StackMessageLog.clear(); ds.close(); - assertTrue(StackMessageLog.popMessage().indexOf("boom") > 0); + final String message = StackMessageLog.popMessage(); + Assert.assertNotNull(message); + assertTrue(message.indexOf("boom") > 0); } catch (final IllegalStateException ex) { assertTrue(ex.getMessage().indexOf("boom") > 0); // RTE is not wrapped by BDS#close } finally { @@ -666,6 +670,7 @@ public class TestBasicDataSource extends TestConnectionPool { conn.close(); assertEquals(0, ds.getNumIdle()); final String message = StackMessageLog.popMessage(); + Assert.assertNotNull(message); assertTrue(message.indexOf("exceeds the maximum permitted value") > 0); } finally { StackMessageLog.clear(); http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java index f3234b8..f4f0f33 100644 --- a/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java +++ b/src/test/java/org/apache/commons/dbcp2/TestBasicDataSourceFactory.java @@ -59,15 +59,14 @@ public class TestBasicDataSourceFactory { try { StackMessageLog.lock(); StackMessageLog.clear(); - final Reference ref = new Reference("javax.sql.DataSource", - BasicDataSourceFactory.class.getName(), null); - ref.add(new StringRefAddr("foo", "bar")); // Unknown + final Reference ref = new Reference("javax.sql.DataSource", BasicDataSourceFactory.class.getName(), null); + ref.add(new StringRefAddr("foo", "bar")); // Unknown ref.add(new StringRefAddr("maxWait", "100")); // Changed - ref.add(new StringRefAddr("driverClassName", "org.apache.commons.dbcp2.TesterDriver")); //OK + ref.add(new StringRefAddr("driverClassName", "org.apache.commons.dbcp2.TesterDriver")); // OK final BasicDataSourceFactory basicDataSourceFactory = new BasicDataSourceFactory(); basicDataSourceFactory.getObjectInstance(ref, null, null, null); final List<String> messages = StackMessageLog.getAll(); - assertEquals(2,messages.size()); + assertEquals(messages.toString(), 2, messages.size()); for (final String message : messages) { if (message.contains("maxWait")) { assertTrue(message.contains("use maxWaitMillis")); @@ -118,6 +117,7 @@ public class TestBasicDataSourceFactory { properties.setProperty("defaultReadOnly", "false"); properties.setProperty("defaultTransactionIsolation", "READ_COMMITTED"); properties.setProperty("defaultCatalog", "test"); + properties.setProperty("defaultSchema", "testSchema"); properties.setProperty("testOnBorrow", "true"); properties.setProperty("testOnReturn", "false"); properties.setProperty("username", "userName"); @@ -158,6 +158,7 @@ public class TestBasicDataSourceFactory { assertEquals(Boolean.FALSE, ds.getDefaultReadOnly()); assertEquals(Connection.TRANSACTION_READ_COMMITTED, ds.getDefaultTransactionIsolation()); assertEquals("test", ds.getDefaultCatalog()); + assertEquals("testSchema", ds.getDefaultSchema()); assertTrue(ds.getTestOnBorrow()); assertFalse(ds.getTestOnReturn()); assertEquals("userName", ds.getUsername()); http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/a0c48c1e/src/test/java/org/apache/commons/dbcp2/TesterConnection.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/dbcp2/TesterConnection.java b/src/test/java/org/apache/commons/dbcp2/TesterConnection.java index a014a60..4329b1f 100644 --- a/src/test/java/org/apache/commons/dbcp2/TesterConnection.java +++ b/src/test/java/org/apache/commons/dbcp2/TesterConnection.java @@ -44,6 +44,7 @@ public class TesterConnection implements Connection { protected int _transactionIsolation = 1; protected DatabaseMetaData _metaData = new TesterDatabaseMetaData(); protected String _catalog = null; + protected String schema; protected Map<String,Class<?>> _typeMap = null; protected boolean _readOnly = false; protected SQLWarning warnings = null; @@ -384,12 +385,14 @@ public class TesterConnection implements Connection { @Override public void setSchema(final String schema) throws SQLException { - throw new SQLException("Not implemented."); + checkOpen(); + this.schema= schema; } @Override public String getSchema() throws SQLException { - throw new SQLException("Not implemented."); + checkOpen(); + return schema; } @Override