Author: psteitz
Date: Fri Feb 13 04:00:39 2015
New Revision: 1659452
URL: http://svn.apache.org/r1659452
Log:
Made sure setting jmxName to null in BasicDataSource suppresses registration
of connection and statement pools. Also added JMX registration of statement
pools for
BasicManagedDataSource when jmxName is not null.
JIRA: DBCP-434
Modified:
commons/proper/dbcp/trunk/src/changes/changes.xml
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
commons/proper/dbcp/trunk/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.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=1659452&r1=1659451&r2=1659452&view=diff
==============================================================================
--- commons/proper/dbcp/trunk/src/changes/changes.xml (original)
+++ commons/proper/dbcp/trunk/src/changes/changes.xml Fri Feb 13 04:00:39 2015
@@ -107,6 +107,10 @@ The <action> type attribute can be add,u
Fixed connection leak when SQLException is thrown while enlisting an XA
transaction.
</action>
+ <action issue="DBCP-434" dev="psteitz" type="fix">
+ Setting jmxName to null should suppress JMX registration of connection
+ and statement pools.
+ </action>
</release>
<release version="2.0.1" date="24 May 2014" description="This is a bug fix
release.">
<action dev="markt" type="fix">
Modified:
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
URL:
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java?rev=1659452&r1=1659451&r2=1659452&view=diff
==============================================================================
---
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
(original)
+++
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
Fri Feb 13 04:00:39 2015
@@ -2219,6 +2219,7 @@ public class BasicDataSource implements
// Create an object pool to contain our active connections
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
updateJmxName(config);
+ config.setJmxEnabled(registeredJmxName != null); // Disable JMX on
the underlying pool if the DS is not registered.
GenericObjectPool<PoolableConnection> gop;
if (abandonedConfig != null &&
(abandonedConfig.getRemoveAbandonedOnBorrow() ||
Modified:
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
URL:
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java?rev=1659452&r1=1659451&r2=1659452&view=diff
==============================================================================
---
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
(original)
+++
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/PoolableConnectionFactory.java
Fri Feb 13 04:00:39 2015
@@ -286,6 +286,8 @@ public class PoolableConnectionFactory
base.append(Long.toString(connIndex));
config.setJmxNameBase(base.toString());
config.setJmxNamePrefix(Constants.JMX_STATEMENT_POOL_PREFIX);
+ } else {
+ config.setJmxEnabled(false);
}
KeyedObjectPool<PStmtKey,DelegatingPreparedStatement> stmtPool =
new GenericKeyedObjectPool<>((PoolingConnection)conn,
config);
@@ -442,6 +444,14 @@ public class PoolableConnectionFactory
protected boolean getCacheState() {
return _cacheState;
}
+
+ protected ObjectName getDataSourceJmxName() {
+ return dataSourceJmxName;
+ }
+
+ protected AtomicLong getConnectionIndex() {
+ return connectionIndex;
+ }
private final ConnectionFactory _connFactory;
private final ObjectName dataSourceJmxName;
Modified:
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
URL:
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java?rev=1659452&r1=1659451&r2=1659452&view=diff
==============================================================================
---
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
(original)
+++
commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/managed/PoolableManagedConnectionFactory.java
Fri Feb 13 04:00:39 2015
@@ -20,6 +20,7 @@ import java.sql.Connection;
import javax.management.ObjectName;
+import org.apache.commons.dbcp2.Constants;
import org.apache.commons.dbcp2.DelegatingPreparedStatement;
import org.apache.commons.dbcp2.PStmtKey;
import org.apache.commons.dbcp2.PoolableConnection;
@@ -67,7 +68,7 @@ public class PoolableManagedConnectionFa
throw new IllegalStateException("Connection factory returned null
from createConnection");
}
initializeConnection(conn);
- if(getPoolStatements()) {
+ if (getPoolStatements()) {
conn = new PoolingConnection(conn);
GenericKeyedObjectPoolConfig config = new
GenericKeyedObjectPoolConfig();
config.setMaxTotalPerKey(-1);
@@ -75,6 +76,17 @@ public class PoolableManagedConnectionFa
config.setMaxWaitMillis(0);
config.setMaxIdlePerKey(1);
config.setMaxTotal(getMaxOpenPreparedStatements());
+ ObjectName dataSourceJmxName = getDataSourceJmxName();
+ long connIndex = getConnectionIndex().getAndIncrement();
+ if (dataSourceJmxName != null) {
+ StringBuilder base = new
StringBuilder(dataSourceJmxName.toString());
+ base.append(Constants.JMX_CONNECTION_BASE_EXT);
+ base.append(Long.toString(connIndex));
+ config.setJmxNameBase(base.toString());
+ config.setJmxNamePrefix(Constants.JMX_STATEMENT_POOL_PREFIX);
+ } else {
+ config.setJmxEnabled(false);
+ }
KeyedObjectPool<PStmtKey,DelegatingPreparedStatement> stmtPool =
new GenericKeyedObjectPool<>((PoolingConnection)conn, config);
((PoolingConnection)conn).setStatementPool(stmtPool);
Modified:
commons/proper/dbcp/trunk/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
URL:
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java?rev=1659452&r1=1659451&r2=1659452&view=diff
==============================================================================
---
commons/proper/dbcp/trunk/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
(original)
+++
commons/proper/dbcp/trunk/src/test/java/org/apache/commons/dbcp2/TestBasicDataSource.java
Fri Feb 13 04:00:39 2015
@@ -20,12 +20,16 @@ package org.apache.commons.dbcp2;
import static org.junit.Assert.*;
import java.io.IOException;
+import java.lang.management.ManagementFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Properties;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
import javax.sql.DataSource;
import org.apache.commons.logging.LogFactory;
@@ -712,6 +716,26 @@ public class TestBasicDataSource extends
ds.close();
}
+
+ /**
+ * Make sure setting jmxName to null suppresses JMX registration of
connection and statement pools.
+ * JIRA: DBCP-434
+ */
+ @Test
+ public void testJmxDisabled() throws Exception {
+ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ // Unregister leftovers from other tests (TODO: worry about concurrent
test execution)
+ ObjectName commons = new ObjectName("org.apache.commons.*:*");
+ Set<ObjectName> results = mbs.queryNames(commons, null);
+ for (ObjectName result : results) {
+ mbs.unregisterMBean(result);
+ }
+ ds.setJmxName(null); // Should disable JMX for both connection and
statement pools
+ ds.setPoolPreparedStatements(true);
+ ds.getConnection(); // Trigger initialization
+ // Nothing should be registered
+ assertEquals(0, mbs.queryNames(commons, null).size());
+ }
}
/**