Author: markt Date: Wed Dec 11 10:37:34 2013 New Revision: 1550099 URL: http://svn.apache.org/r1550099 Log: DBCP-292 Register BasicDataSource implementations with JMX, exposing the configuration properties as well as the current state of the connection pool and statement pools.
Added: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java (with props) Modified: commons/proper/dbcp/trunk/src/changes/changes.xml commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java Modified: commons/proper/dbcp/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/changes/changes.xml?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/changes/changes.xml (original) +++ commons/proper/dbcp/trunk/src/changes/changes.xml Wed Dec 11 10:37:34 2013 @@ -82,6 +82,11 @@ The <action> type attribute can be add,u Fix threading issues with accessToUnderlyingConnectionAllowed attribute of PoolingDriver which is used to support unit testing. </action> + <action dev="markt" issue="DBCP-292" type="add"> + BasicDataSource instances are now exposed via JMX. All the configuration + properties are available as is the connection pool and the statement + pools (if statement pooling is enabled). + </action> </release> <release version="1.5.1" date="TBD" description="TBD"> <action dev="markt" issue="DBCP-405" type="fix"> Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSource.java Wed Dec 11 10:37:34 2013 @@ -17,6 +17,7 @@ package org.apache.commons.dbcp2; import java.io.PrintWriter; +import java.lang.management.ManagementFactory; import java.util.Properties; import java.util.Collection; import java.util.List; @@ -30,8 +31,12 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; +import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanRegistration; +import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.sql.DataSource; @@ -59,7 +64,8 @@ import org.apache.commons.pool2.impl.Gen * @author Dirk Verbeeck * @version $Revision$ $Date$ */ -public class BasicDataSource implements DataSource, MBeanRegistration { +public class BasicDataSource + implements DataSource, BasicDataSourceMXBean, MBeanRegistration { private static final Log log = LogFactory.getLog(BasicDataSource.class); @@ -81,6 +87,7 @@ public class BasicDataSource implements * * @return true if default auto-commit is enabled */ + @Override public boolean getDefaultAutoCommit() { return this.defaultAutoCommit; } @@ -112,6 +119,7 @@ public class BasicDataSource implements * * @return true if connections are readOnly by default */ + @Override public boolean getDefaultReadOnly() { Boolean val = defaultReadOnly; if (val != null) { @@ -147,6 +155,7 @@ public class BasicDataSource implements * @return the default value for transaction isolation state * @see Connection#getTransactionIsolation */ + @Override public int getDefaultTransactionIsolation() { return this.defaultTransactionIsolation; } @@ -180,6 +189,7 @@ public class BasicDataSource implements * * @return the default catalog */ + @Override public String getDefaultCatalog() { return this.defaultCatalog; } @@ -215,6 +225,7 @@ public class BasicDataSource implements * * @return the state caching flag */ + @Override public boolean getCacheState() { return cacheState; } @@ -275,6 +286,7 @@ public class BasicDataSource implements * * @return the jdbc driver class name */ + @Override public synchronized String getDriverClassName() { return this.driverClassName; } @@ -352,6 +364,7 @@ public class BasicDataSource implements * * @see #lifo */ + @Override public synchronized boolean getLifo() { return this.lifo; } @@ -384,6 +397,7 @@ public class BasicDataSource implements * * @return the maximum number of active connections */ + @Override public synchronized int getMaxTotal() { return this.maxTotal; } @@ -422,6 +436,7 @@ public class BasicDataSource implements * * @return the maximum number of idle connections */ + @Override public synchronized int getMaxIdle() { return this.maxIdle; } @@ -458,6 +473,7 @@ public class BasicDataSource implements * @return the minimum number of idle connections * @see GenericObjectPool#getMinIdle() */ + @Override public synchronized int getMinIdle() { return this.minIdle; } @@ -491,6 +507,7 @@ public class BasicDataSource implements * * @return the number of connections created when the pool is initialized */ + @Override public synchronized int getInitialSize() { return this.initialSize; } @@ -528,6 +545,7 @@ public class BasicDataSource implements * * @return the maxWaitMillis property value */ + @Override public synchronized long getMaxWaitMillis() { return this.maxWaitMillis; } @@ -559,6 +577,7 @@ public class BasicDataSource implements * * @return true if prepared and callable statements are pooled */ + @Override public synchronized boolean isPoolPreparedStatements() { return this.poolPreparedStatements; } @@ -598,6 +617,7 @@ public class BasicDataSource implements * @return the maximum number of open statements * @see #maxOpenPreparedStatements */ + @Override public synchronized int getMaxOpenPreparedStatements() { return this.maxOpenPreparedStatements; } @@ -634,6 +654,7 @@ public class BasicDataSource implements * * @see #testOnBorrow */ + @Override public synchronized boolean getTestOnBorrow() { return this.testOnBorrow; } @@ -700,6 +721,7 @@ public class BasicDataSource implements * @return the time (in milliseconds) between evictor runs * @see #timeBetweenEvictionRunsMillis */ + @Override public synchronized long getTimeBetweenEvictionRunsMillis() { return this.timeBetweenEvictionRunsMillis; } @@ -731,6 +753,7 @@ public class BasicDataSource implements * runs * @see #numTestsPerEvictionRun */ + @Override public synchronized int getNumTestsPerEvictionRun() { return this.numTestsPerEvictionRun; } @@ -762,6 +785,7 @@ public class BasicDataSource implements * @return the value of the {@link #minEvictableIdleTimeMillis} property * @see #minEvictableIdleTimeMillis */ + @Override public synchronized long getMinEvictableIdleTimeMillis() { return this.minEvictableIdleTimeMillis; } @@ -828,6 +852,7 @@ public class BasicDataSource implements * in the pool * @since 1.4.1 */ + @Override public synchronized long getSoftMinEvictableIdleTimeMillis() { return softMinEvictableIdleTimeMillis; } @@ -846,6 +871,7 @@ public class BasicDataSource implements * validated * @see #testWhileIdle */ + @Override public synchronized boolean getTestWhileIdle() { return this.testWhileIdle; } @@ -871,6 +897,7 @@ public class BasicDataSource implements * * @return the current number of active connections */ + @Override public synchronized int getNumActive() { if (connectionPool != null) { return connectionPool.getNumActive(); @@ -886,6 +913,7 @@ public class BasicDataSource implements * * @return the current number of idle connections */ + @Override public synchronized int getNumIdle() { if (connectionPool != null) { return connectionPool.getNumIdle(); @@ -905,6 +933,7 @@ public class BasicDataSource implements * * @return the connection password */ + @Override public String getPassword() { return this.password; } @@ -936,6 +965,7 @@ public class BasicDataSource implements * @return the {@link #url} passed to the JDBC driver to establish * connections */ + @Override public synchronized String getUrl() { return this.url; } @@ -967,6 +997,7 @@ public class BasicDataSource implements * @return the {@link #username} passed to the JDBC driver to establish * connections */ + @Override public String getUsername() { return this.username; } @@ -1001,6 +1032,7 @@ public class BasicDataSource implements * @return the SQL validation query * @see #validationQuery */ + @Override public String getValidationQuery() { return this.validationQuery; } @@ -1037,6 +1069,7 @@ public class BasicDataSource implements * @return the timeout in seconds before connection validation queries fail. * @since 1.3 */ + @Override public int getValidationQueryTimeout() { return validationQueryTimeout; } @@ -1089,6 +1122,16 @@ public class BasicDataSource implements } /** + * Provides the same data as {@link #getConnectionInitSqls()} but in an + * array so it is accessible via JMX. + */ + @Override + public String[] getConnectionInitSqlsAsArray() { + Collection<String> result = getConnectionInitSqls(); + return result.toArray(new String[result.size()]); + } + + /** * Sets the list of SQL statements to be executed when a physical * connection is first created. * <p> @@ -1132,6 +1175,7 @@ public class BasicDataSource implements * @return true if access to the underlying connection is allowed, false * otherwise. */ + @Override public synchronized boolean isAccessToUnderlyingConnectionAllowed() { return this.accessToUnderlyingConnectionAllowed; } @@ -1160,6 +1204,7 @@ public class BasicDataSource implements * Returns the maximum permitted lifetime of a connection in milliseconds. A * value of zero or less indicates an infinite lifetime. */ + @Override public long getMaxConnLifetimeMillis() { return maxConnLifetimeMillis; } @@ -1177,6 +1222,27 @@ public class BasicDataSource implements this.maxConnLifetimeMillis = maxConnLifetimeMillis; } + private String jmxName = null; + + /** + * Returns the JMX name that has been requested for this DataSource. If the + * requested name is not valid, an alternative may be chosen. + */ + public String getJmxName() { + return jmxName; + } + + /** + * Sets the JMX name that has been requested for this DataSource. If the + * requested name is not valid, an alternative may be chosen. This + * DataSource will attempt to register itself using this name. If another + * component registers this DataSource with JMX and this name is valid this + * name will be used in preference to any specified by the other component. + */ + public void setJmxName(String jmxName) { + this.jmxName = jmxName; + } + // ----------------------------------------------------- Instance Variables @@ -1357,6 +1423,7 @@ public class BasicDataSource implements * * @see #getRemoveAbandonedTimeout() */ + @Override public boolean getRemoveAbandonedOnBorrow() { if (abandonedConfig != null) { return abandonedConfig.getRemoveAbandonedOnBorrow(); @@ -1408,6 +1475,7 @@ public class BasicDataSource implements * * @see #getRemoveAbandonedTimeout() */ + @Override public boolean getRemoveAbandonedOnMaintenance() { if (abandonedConfig != null) { return abandonedConfig.getRemoveAbandonedOnMaintenance(); @@ -1454,6 +1522,7 @@ public class BasicDataSource implements * * <p>The default value is 300 seconds.</p> */ + @Override public int getRemoveAbandonedTimeout() { if (abandonedConfig != null) { return abandonedConfig.getRemoveAbandonedTimeout(); @@ -1492,6 +1561,7 @@ public class BasicDataSource implements * for every Connection open or new Statement because a stack * trace has to be generated. </p> */ + @Override public boolean getLogAbandoned() { if (abandonedConfig != null) { return abandonedConfig.getLogAbandoned(); @@ -1543,6 +1613,7 @@ public class BasicDataSource implements * * @return <code>true</code> if usage tracking is enabled */ + @Override public boolean getAbandonedUsageTracking() { if (abandonedConfig != null) { return abandonedConfig.getUseUsageTracking(); @@ -1668,6 +1739,7 @@ public class BasicDataSource implements * If true, this data source is closed and no more connections can be retrieved from this datasource. * @return true, if the data source is closed; false otherwise */ + @Override public synchronized boolean isClosed() { return closed; } @@ -1715,6 +1787,8 @@ public class BasicDataSource implements return (dataSource); } + jmxRegister(); + // create factory which returns raw physical connections ConnectionFactory driverConnectionFactory = createConnectionFactory(); @@ -1959,8 +2033,7 @@ public class BasicDataSource implements ConnectionFactory driverConnectionFactory) throws SQLException { PoolableConnectionFactory connectionFactory = null; try { - connectionFactory = - new PoolableConnectionFactory(driverConnectionFactory); + connectionFactory = new PoolableConnectionFactory(driverConnectionFactory, registeredJmxName); connectionFactory.setValidationQuery(validationQuery); connectionFactory.setValidationQueryTimeout(validationQueryTimeout); connectionFactory.setConnectionInitSql(connectionInitSqls); @@ -2008,13 +2081,54 @@ public class BasicDataSource implements } } - private ObjectName oname = null; + /** + * Actual name under which this component has been registered. + */ + private ObjectName registeredJmxName = null; + private void jmxRegister() { + // Return immediately if this DataSource has already been registered + if (registeredJmxName != null) { + return; + } + // Return immediately if no JMX name has been specified + String requestedName = getJmxName(); + if (requestedName == null) { + return; + } + ObjectName oname; + try { + oname = new ObjectName(requestedName); + } catch (MalformedObjectNameException e) { + log.warn("The requested JMX name [" + requestedName + + "] was not valid and will be ignored."); + return; + } + + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + try { + mbs.registerMBean(this, oname); + } catch (InstanceAlreadyExistsException | MBeanRegistrationException + | NotCompliantMBeanException e) { + log.warn("Failed to complete JMX registration", e); + } + } + @Override - public ObjectName preRegister(MBeanServer server, ObjectName name) - throws Exception { - oname = name; - return name; + public ObjectName preRegister(MBeanServer server, ObjectName name) { + String requestedName = getJmxName(); + if (requestedName != null) { + try { + registeredJmxName = new ObjectName(requestedName); + } catch (MalformedObjectNameException e) { + log.warn("The requested JMX name [" + requestedName + + "] was not valid and will be ignored."); + } + } + if (registeredJmxName == null) { + registeredJmxName = name; + } + return registeredJmxName; } @Override @@ -2033,12 +2147,16 @@ public class BasicDataSource implements } private void updateJmxName(GenericObjectPoolConfig config) { - if (oname == null) { + if (registeredJmxName == null) { return; } - StringBuilder base = new StringBuilder(oname.toString()); + StringBuilder base = new StringBuilder(registeredJmxName.toString()); base.append(",pool="); config.setJmxNameBase(base.toString()); config.setJmxNamePrefix("connections"); } + + protected ObjectName getRegisteredJmxName() { + return registeredJmxName; + } } Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceFactory.java Wed Dec 11 10:37:34 2013 @@ -70,6 +70,8 @@ public class BasicDataSourceFactory impl private final static String PROP_USERNAME = "username"; private final static String PROP_VALIDATIONQUERY = "validationQuery"; private final static String PROP_VALIDATIONQUERY_TIMEOUT = "validationQueryTimeout"; + private final static String PROP_JMX_NAME = "jmxName"; + /** * The property name for connectionInitSqls. * The associated value String must be of the form [query;]* @@ -387,6 +389,11 @@ public class BasicDataSourceFactory impl dataSource.setMaxConnLifetimeMillis(Long.parseLong(value)); } + value = properties.getProperty(PROP_JMX_NAME); + if (value != null) { + dataSource.setJmxName(value); + } + // DBCP-215 // Trick to make sure that initialSize connections are created if (dataSource.getInitialSize() > 0) { Added: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java?rev=1550099&view=auto ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java (added) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java Wed Dec 11 10:37:34 2013 @@ -0,0 +1,241 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.dbcp2; + +/** + * Defines the methods that will be made available via JMX. + * + * @since 2.0 + */ +public interface BasicDataSourceMXBean { + + /** + * @See {@link BasicDataSource#getAbandonedUsageTracking()} + * @return {@link BasicDataSource#getAbandonedUsageTracking()} + */ + boolean getAbandonedUsageTracking(); + + /** + * @See {@link BasicDataSource#getDefaultAutoCommit()} + * @return {@link BasicDataSource#getDefaultAutoCommit()} + */ + boolean getDefaultAutoCommit(); + + /** + * @See {@link BasicDataSource#getDefaultReadOnly()} + * @return {@link BasicDataSource#getDefaultReadOnly()} + */ + boolean getDefaultReadOnly(); + + /** + * @See {@link BasicDataSource#getDefaultTransactionIsolation()} + * @return {@link BasicDataSource#getDefaultTransactionIsolation()} + */ + int getDefaultTransactionIsolation(); + + /** + * @See {@link BasicDataSource#getDefaultCatalog()} + * @return {@link BasicDataSource#getDefaultCatalog()} + */ + String getDefaultCatalog(); + + /** + * @See {@link BasicDataSource#getCacheState()} + * @return {@link BasicDataSource#getCacheState()} + */ + boolean getCacheState(); + + /** + * @See {@link BasicDataSource#getDriverClassName()} + * @return {@link BasicDataSource#getDriverClassName()} + */ + String getDriverClassName(); + + /** + * @See {@link BasicDataSource#getLifo()} + * @return {@link BasicDataSource#getLifo()} + */ + boolean getLifo(); + + /** + * @See {@link BasicDataSource#getMaxTotal()} + * @return {@link BasicDataSource#getMaxTotal()} + */ + int getMaxTotal(); + + /** + * @See {@link BasicDataSource#getMaxIdle()} + * @return {@link BasicDataSource#getMaxIdle()} + */ + int getMaxIdle(); + + /** + * @See {@link BasicDataSource#getMinIdle()} + * @return {@link BasicDataSource#getMinIdle()} + */ + int getMinIdle(); + + /** + * @See {@link BasicDataSource#getInitialSize()} + * @return {@link BasicDataSource#getInitialSize()} + */ + int getInitialSize(); + + /** + * @See {@link BasicDataSource#getMaxWaitMillis()} + * @return {@link BasicDataSource#getMaxWaitMillis()} + */ + long getMaxWaitMillis(); + + /** + * @See {@link BasicDataSource#isPoolPreparedStatements()} + * @return {@link BasicDataSource#isPoolPreparedStatements()} + */ + boolean isPoolPreparedStatements(); + + /** + * @See {@link BasicDataSource#getMaxOpenPreparedStatements()} + * @return {@link BasicDataSource#getMaxOpenPreparedStatements()} + */ + int getMaxOpenPreparedStatements(); + + /** + * @See {@link BasicDataSource#getTestOnBorrow()} + * @return {@link BasicDataSource#getTestOnBorrow()} + */ + boolean getTestOnBorrow(); + + /** + * @See {@link BasicDataSource#getTimeBetweenEvictionRunsMillis()} + * @return {@link BasicDataSource#getTimeBetweenEvictionRunsMillis()} + */ + long getTimeBetweenEvictionRunsMillis(); + + /** + * @See {@link BasicDataSource#getNumTestsPerEvictionRun()} + * @return {@link BasicDataSource#getNumTestsPerEvictionRun()} + */ + int getNumTestsPerEvictionRun(); + + /** + * @See {@link BasicDataSource#getMinEvictableIdleTimeMillis()} + * @return {@link BasicDataSource#getMinEvictableIdleTimeMillis()} + */ + long getMinEvictableIdleTimeMillis(); + + /** + * @See {@link BasicDataSource#getSoftMinEvictableIdleTimeMillis()} + * @return {@link BasicDataSource#getSoftMinEvictableIdleTimeMillis()} + */ + long getSoftMinEvictableIdleTimeMillis(); + + /** + * @See {@link BasicDataSource#getTestWhileIdle()} + * @return {@link BasicDataSource#getTestWhileIdle()} + */ + boolean getTestWhileIdle(); + + /** + * @See {@link BasicDataSource#getNumActive()} + * @return {@link BasicDataSource#getNumActive()} + */ + int getNumActive(); + + /** + * @See {@link BasicDataSource#getNumIdle()} + * @return {@link BasicDataSource#getNumIdle()} + */ + int getNumIdle(); + + /** + * @See {@link BasicDataSource#getPassword()} + * @return {@link BasicDataSource#getPassword()} + */ + String getPassword(); + + /** + * @See {@link BasicDataSource#getUrl()} + * @return {@link BasicDataSource#getUrl()} + */ + String getUrl(); + + /** + * @See {@link BasicDataSource#getUsername()} + * @return {@link BasicDataSource#getUsername()} + */ + String getUsername(); + + /** + * @See {@link BasicDataSource#getValidationQuery()} + * @return {@link BasicDataSource#getValidationQuery()} + */ + String getValidationQuery(); + + /** + * @See {@link BasicDataSource#getValidationQueryTimeout()} + * @return {@link BasicDataSource#getValidationQueryTimeout()} + */ + int getValidationQueryTimeout(); + + /** + * @See {@link BasicDataSource#getConnectionInitSqlsAsArray()} + * @return {@link BasicDataSource#getConnectionInitSqlsAsArray()} + */ + String[] getConnectionInitSqlsAsArray(); + + /** + * @See {@link BasicDataSource#isAccessToUnderlyingConnectionAllowed()} + * @return {@link BasicDataSource#isAccessToUnderlyingConnectionAllowed()} + */ + boolean isAccessToUnderlyingConnectionAllowed(); + + /** + * @See {@link BasicDataSource#getMaxConnLifetimeMillis()} + * @return {@link BasicDataSource#getMaxConnLifetimeMillis()} + */ + long getMaxConnLifetimeMillis(); + + /** + * @See {@link BasicDataSource#getRemoveAbandonedOnBorrow()} + * @return {@link BasicDataSource#getRemoveAbandonedOnBorrow()} + */ + boolean getRemoveAbandonedOnBorrow(); + + /** + * @See {@link BasicDataSource#getRemoveAbandonedOnMaintenance()} + * @return {@link BasicDataSource#getRemoveAbandonedOnMaintenance()} + */ + boolean getRemoveAbandonedOnMaintenance(); + + /** + * @See {@link BasicDataSource#getRemoveAbandonedTimeout()} + * @return {@link BasicDataSource#getRemoveAbandonedTimeout()} + */ + int getRemoveAbandonedTimeout(); + + /** + * @See {@link BasicDataSource#getLogAbandoned()} + * @return {@link BasicDataSource#getLogAbandoned()} + */ + boolean getLogAbandoned(); + + /** + * @See {@link BasicDataSource#isClosed()} + * @return {@link BasicDataSource#isClosed()} + */ + boolean isClosed(); +} Propchange: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/BasicDataSourceMXBean.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/DelegatingConnection.java Wed Dec 11 10:37:34 2013 @@ -110,9 +110,11 @@ public class DelegatingConnection<C exte s = "connection is closed"; } else { + StringBuffer sb = new StringBuffer(); + sb.append(hashCode()); DatabaseMetaData meta = c.getMetaData(); if (meta != null) { - StringBuffer sb = new StringBuffer(); + sb.append(", URL="); sb.append(meta.getURL()); sb.append(", UserName="); sb.append(meta.getUserName()); Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java Wed Dec 11 10:37:34 2013 @@ -23,6 +23,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; +import javax.management.ObjectName; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.pool2.KeyedObjectPool; @@ -54,16 +56,10 @@ public class PoolableConnectionFactory * @param connFactory the {@link ConnectionFactory} from which to obtain * base {@link Connection}s */ - public PoolableConnectionFactory(ConnectionFactory connFactory) { - _connFactory = connFactory; - } - - /** - * Sets the {@link ConnectionFactory} from which to obtain base {@link Connection}s. - * @param connFactory the {@link ConnectionFactory} from which to obtain base {@link Connection}s - */ - public void setConnectionFactory(ConnectionFactory connFactory) { + public PoolableConnectionFactory(ConnectionFactory connFactory, + ObjectName dataSourceJmxName) { _connFactory = connFactory; + this.dataSourceJmxName = dataSourceJmxName; } /** @@ -203,6 +199,12 @@ public class PoolableConnectionFactory config.setMaxWaitMillis(0); config.setMaxIdlePerKey(1); config.setMaxTotal(maxOpenPreparedStatements); + if (dataSourceJmxName != null) { + StringBuilder base = new StringBuilder(dataSourceJmxName.toString()); + base.append(",pool=statements,connection="); + config.setJmxNameBase(base.toString()); + config.setJmxNamePrefix(Integer.toString(conn.hashCode())); + } KeyedObjectPool<PStmtKey,DelegatingPreparedStatement> stmtPool = new GenericKeyedObjectPool<>((PoolingConnection)conn, config); ((PoolingConnection)conn).setStatementPool(stmtPool); @@ -348,7 +350,8 @@ public class PoolableConnectionFactory } - protected volatile ConnectionFactory _connFactory = null; + protected final ConnectionFactory _connFactory; + private final ObjectName dataSourceJmxName; protected volatile String _validationQuery = null; protected volatile int _validationQueryTimeout = -1; protected Collection<String> _connectionInitSqls = null; Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java Wed Dec 11 10:37:34 2013 @@ -183,7 +183,7 @@ public class BasicManagedDataSource exte PoolableConnectionFactory connectionFactory = null; try { connectionFactory = new PoolableManagedConnectionFactory( - (XAConnectionFactory) driverConnectionFactory); + (XAConnectionFactory) driverConnectionFactory, getRegisteredJmxName()); connectionFactory.setValidationQuery(validationQuery); connectionFactory.setValidationQueryTimeout(validationQueryTimeout); connectionFactory.setConnectionInitSql(connectionInitSqls); Modified: commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java (original) +++ commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java Wed Dec 11 10:37:34 2013 @@ -18,6 +18,8 @@ package org.apache.commons.dbcp2.managed; import java.sql.Connection; +import javax.management.ObjectName; + import org.apache.commons.dbcp2.DelegatingPreparedStatement; import org.apache.commons.dbcp2.PStmtKey; import org.apache.commons.dbcp2.PoolableConnection; @@ -44,8 +46,9 @@ public class PoolableManagedConnectionFa * * @param connFactory XAConnectionFactory */ - public PoolableManagedConnectionFactory(XAConnectionFactory connFactory) { - super(connFactory); + public PoolableManagedConnectionFactory(XAConnectionFactory connFactory, + ObjectName dataSourceJmxName) { + super(connFactory, dataSourceJmxName); this.transactionRegistry = connFactory.getTransactionRegistry(); } Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestBasicDataSource.java Wed Dec 11 10:37:34 2013 @@ -68,6 +68,7 @@ public class TestBasicDataSource extends ds.setValidationQuery("SELECT DUMMY FROM DUAL"); ds.setConnectionInitSqls(Arrays.asList(new String[] { "SELECT 1", "SELECT 2"})); ds.setDriverClassLoader(new TesterClassLoader()); + ds.setJmxName("org.apache.commons.dbcp2:name=test"); } protected BasicDataSource createDataSource() throws Exception { Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestDriverManagerConnectionFactory.java Wed Dec 11 10:37:34 2013 @@ -56,7 +56,7 @@ public class TestDriverManagerConnection "jdbc:apache:commons:testdriver", "foo", "bar"); final PoolableConnectionFactory poolableConnectionFactory = - new PoolableConnectionFactory(connectionFactory); + new PoolableConnectionFactory(connectionFactory, null); poolableConnectionFactory.setDefaultReadOnly(false); poolableConnectionFactory.setDefaultAutoCommit(true); Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPStmtPooling.java Wed Dec 11 10:37:34 2013 @@ -53,7 +53,7 @@ public class TestPStmtPooling extends Te "jdbc:apache:commons:testdriver","u1","p1"); PoolableConnectionFactory pcf = - new PoolableConnectionFactory(connFactory); + new PoolableConnectionFactory(connFactory, null); pcf.setPoolStatements(true); pcf.setDefaultReadOnly(false); pcf.setDefaultAutoCommit(true); @@ -78,7 +78,7 @@ public class TestPStmtPooling extends Te "jdbc:apache:commons:testdriver","u1","p1"); PoolableConnectionFactory pcf = - new PoolableConnectionFactory(connFactory); + new PoolableConnectionFactory(connFactory, null); pcf.setPoolStatements(true); pcf.setDefaultReadOnly(false); pcf.setDefaultAutoCommit(true); @@ -117,7 +117,7 @@ public class TestPStmtPooling extends Te "jdbc:apache:commons:testdriver","u1","p1"); PoolableConnectionFactory pcf = - new PoolableConnectionFactory(connFactory); + new PoolableConnectionFactory(connFactory, null); pcf.setPoolStatements(true); pcf.setDefaultReadOnly(false); pcf.setDefaultAutoCommit(true); Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolableConnection.java Wed Dec 11 10:37:34 2013 @@ -46,7 +46,8 @@ public class TestPoolableConnection exte public void setUp() throws Exception { PoolableConnectionFactory factory = new PoolableConnectionFactory( new DriverConnectionFactory( - new TesterDriver(),"jdbc:apache:commons:testdriver", null)); + new TesterDriver(),"jdbc:apache:commons:testdriver", null), + null); factory.setDefaultAutoCommit(true); factory.setDefaultReadOnly(true); Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDataSource.java Wed Dec 11 10:37:34 2013 @@ -55,8 +55,9 @@ public class TestPoolingDataSource exten props.setProperty("password", "password"); PoolableConnectionFactory factory = new PoolableConnectionFactory( - new DriverConnectionFactory(new TesterDriver(), - "jdbc:apache:commons:testdriver", props)); + new DriverConnectionFactory(new TesterDriver(), + "jdbc:apache:commons:testdriver", props), + null); factory.setValidationQuery("SELECT DUMMY FROM DUAL"); factory.setDefaultReadOnly(true); factory.setDefaultAutoCommit(true); Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/TestPoolingDriver.java Wed Dec 11 10:37:34 2013 @@ -60,7 +60,7 @@ public class TestPoolingDriver extends T super.setUp(); DriverConnectionFactory cf = new DriverConnectionFactory(new TesterDriver(),"jdbc:apache:commons:testdriver",null); - PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf); + PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf, null); pcf.setPoolStatements(true); pcf.setMaxOpenPrepatedStatements(10); pcf.setValidationQuery("SELECT COUNT(*) FROM DUAL"); @@ -95,7 +95,7 @@ public class TestPoolingDriver extends T public void test1() { ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string","username","password"); PoolableConnectionFactory pcf = - new PoolableConnectionFactory(connectionFactory); + new PoolableConnectionFactory(connectionFactory, null); pcf.setDefaultReadOnly(false); pcf.setDefaultAutoCommit(true); GenericObjectPool<PoolableConnection> connectionPool = @@ -107,7 +107,7 @@ public class TestPoolingDriver extends T public void test2() { ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string","username","password"); PoolableConnectionFactory pcf = - new PoolableConnectionFactory(connectionFactory); + new PoolableConnectionFactory(connectionFactory, null); pcf.setDefaultReadOnly(false); pcf.setDefaultAutoCommit(true); GenericObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(pcf); @@ -147,7 +147,7 @@ public class TestPoolingDriver extends T "username", "password"); PoolableConnectionFactory poolableConnectionFactory = - new PoolableConnectionFactory(connectionFactory); + new PoolableConnectionFactory(connectionFactory, null); poolableConnectionFactory.setDefaultReadOnly(false); poolableConnectionFactory.setDefaultAutoCommit(true); ObjectPool<PoolableConnection> connectionPool = Modified: commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java URL: http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java?rev=1550099&r1=1550098&r2=1550099&view=diff ============================================================================== --- commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java (original) +++ commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp2/managed/TestManagedDataSource.java Wed Dec 11 10:37:34 2013 @@ -76,7 +76,7 @@ public class TestManagedDataSource exten // create the pool object factory PoolableConnectionFactory factory = - new PoolableConnectionFactory(xaConnectionFactory); + new PoolableConnectionFactory(xaConnectionFactory, null); factory.setValidationQuery("SELECT DUMMY FROM DUAL"); factory.setDefaultReadOnly(true); factory.setDefaultAutoCommit(true);