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());
+    }
 }
 
 /**


Reply via email to