You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:25:15 UTC

[sling-org-apache-sling-datasource] 05/22: SLING-3637 - Create connection pool lazily in DataSource Provider bundle

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.datasource-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-datasource.git

commit 6958fa8905c2da4b4829cb37e64417abe32e118b
Author: Chetan Mehrotra <ch...@apache.org>
AuthorDate: Wed Jun 4 13:24:14 2014 +0000

    SLING-3637 - Create connection pool lazily in DataSource Provider bundle
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/datasource@1600198 13f79535-47bb-0310-9956-ffa450edef68
---
 .../datasource/internal/DataSourceFactory.java     | 65 ++++++++++++++--------
 .../datasource/internal/DriverDataSource.java      | 25 ++++++---
 2 files changed, 58 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/apache/sling/extensions/datasource/internal/DataSourceFactory.java b/src/main/java/org/apache/sling/extensions/datasource/internal/DataSourceFactory.java
index f653fcc..43b5815 100644
--- a/src/main/java/org/apache/sling/extensions/datasource/internal/DataSourceFactory.java
+++ b/src/main/java/org/apache/sling/extensions/datasource/internal/DataSourceFactory.java
@@ -19,6 +19,7 @@
 package org.apache.sling.extensions.datasource.internal;
 
 import java.lang.management.ManagementFactory;
+import java.sql.SQLException;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.Map;
@@ -26,7 +27,6 @@ import java.util.Properties;
 
 import javax.management.InstanceNotFoundException;
 import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.sql.DataSource;
 
@@ -115,10 +115,7 @@ public class DataSourceFactory {
         }
 
         dataSource = createDataSource(props, bundleContext);
-
         registerDataSource(bundleContext);
-        registerJmx();
-
         log.info("Created DataSource [{}] with properties {}", name, getDataSourceDetails());
     }
 
@@ -139,20 +136,15 @@ public class DataSourceFactory {
     private DataSource createDataSource(Properties props, BundleContext bundleContext) throws Exception {
         PoolConfiguration poolProperties = org.apache.tomcat.jdbc.pool.DataSourceFactory.parsePoolProperties(props);
 
-        DriverDataSource driverDataSource = new DriverDataSource(poolProperties, driverRegistry, bundleContext);
+        DriverDataSource driverDataSource = new DriverDataSource(poolProperties, driverRegistry,
+                bundleContext, this);
 
         //Specify the DataSource such that connection creation logic is handled
         //by us where we take care of OSGi env
         poolProperties.setDataSource(driverDataSource);
 
-        org.apache.tomcat.jdbc.pool.DataSource dataSource =
-                new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
-        //initialise the pool itself
-        ConnectionPool pool = dataSource.createPool();
-        driverDataSource.setJmxPool(pool.getJmxPool());
-
         // Return the configured DataSource instance
-        return dataSource;
+        return new LazyJmxRegisteringDataSource(poolProperties);
     }
 
     private void registerDataSource(BundleContext bundleContext) {
@@ -163,12 +155,9 @@ public class DataSourceFactory {
         dsRegistration = bundleContext.registerService(DataSource.class, dataSource, svcProps);
     }
 
-    private void registerJmx() throws MalformedObjectNameException {
-        if(dataSource instanceof DataSourceProxy){
-            org.apache.tomcat.jdbc.pool.jmx.ConnectionPool pool =
-                    ((DataSourceProxy) dataSource).getPool().getJmxPool();
-
-            if(pool == null){
+    void registerJmx(ConnectionPool pool) throws SQLException {
+            org.apache.tomcat.jdbc.pool.jmx.ConnectionPool jmxPool = pool.getJmxPool();
+            if (jmxPool == null) {
                 //jmx not enabled
                 return;
             }
@@ -176,16 +165,19 @@ public class DataSourceFactory {
             table.put("type", "ConnectionPool");
             table.put("class", DataSource.class.getName());
             table.put("name", ObjectName.quote(name));
-            jmxName = new ObjectName("org.apache.sling", table);
 
             try {
+                jmxName = new ObjectName("org.apache.sling", table);
                 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-                mbs.registerMBean(pool, jmxName);
-            }catch(Exception e){
+                mbs.registerMBean(jmxPool, jmxName);
+            } catch (Exception e) {
                 log.warn("Error occurred while registering the JMX Bean for " +
-                        "connection pool with name {}",jmxName, e);
+                        "connection pool with name {}", jmxName, e);
             }
-        }
+    }
+
+    ConnectionPool getPool() {
+        return ((DataSourceProxy) dataSource).getPool();
     }
 
     private void unregisterJmx(){
@@ -219,6 +211,33 @@ public class DataSourceFactory {
         }
     }
 
+    private class LazyJmxRegisteringDataSource extends org.apache.tomcat.jdbc.pool.DataSource {
+        private volatile boolean initialized;
+
+        public LazyJmxRegisteringDataSource(PoolConfiguration poolProperties) {
+            super(poolProperties);
+        }
+
+        @Override
+        public ConnectionPool createPool() throws SQLException {
+            ConnectionPool pool = super.createPool();
+            registerJmxLazily(pool);
+            return pool;
+        }
+
+        private void registerJmxLazily(ConnectionPool pool) throws SQLException {
+            if(!initialized){
+                synchronized (this){
+                    if(initialized){
+                        return;
+                    }
+                    DataSourceFactory.this.registerJmx(pool);
+                    initialized = true;
+                }
+            }
+        }
+    }
+
     /**
      * Dummy impl to enable access to protected fields
      */
diff --git a/src/main/java/org/apache/sling/extensions/datasource/internal/DriverDataSource.java b/src/main/java/org/apache/sling/extensions/datasource/internal/DriverDataSource.java
index e2e0b32..58f7ccb 100644
--- a/src/main/java/org/apache/sling/extensions/datasource/internal/DriverDataSource.java
+++ b/src/main/java/org/apache/sling/extensions/datasource/internal/DriverDataSource.java
@@ -51,14 +51,16 @@ class DriverDataSource implements DataSource {
     private final DriverRegistry driverRegistry;
     private final BundleContext bundleContext;
     private final org.slf4j.Logger log = LoggerFactory.getLogger(getClass());
-    private org.apache.tomcat.jdbc.pool.jmx.ConnectionPool jmxPool;
     private Driver driver;
+    private final DataSourceFactory dataSourceFactory;
 
     public DriverDataSource(PoolConfiguration poolProperties, DriverRegistry driverRegistry,
-                            BundleContext bundleContext) {
+                            BundleContext bundleContext,
+                            DataSourceFactory dataSourceFactory) {
         this.poolProperties = poolProperties;
         this.driverRegistry = driverRegistry;
         this.bundleContext = bundleContext;
+        this.dataSourceFactory = dataSourceFactory;
     }
 
     public Connection getConnection() throws SQLException {
@@ -85,8 +87,9 @@ class DriverDataSource implements DataSource {
             if (log.isDebugEnabled()) {
                 log.debug("Unable to connect to database.", x);
             }
-            //Based on logic in org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver()
-            if (jmxPool!=null) {
+            //Based on logic in org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver()\
+            org.apache.tomcat.jdbc.pool.jmx.ConnectionPool jmxPool = getJmxPool();
+            if (jmxPool !=null) {
                 jmxPool.notify(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool.NOTIFY_CONNECT,
                         ConnectionPool.getStackTrace(x));
             }
@@ -105,10 +108,6 @@ class DriverDataSource implements DataSource {
         return connection;
     }
 
-    public void setJmxPool(org.apache.tomcat.jdbc.pool.jmx.ConnectionPool jmxPool) {
-        this.jmxPool = jmxPool;
-    }
-
     //~-------------------------------------< DataSource >
 
     public PrintWriter getLogWriter() throws SQLException {
@@ -127,6 +126,7 @@ class DriverDataSource implements DataSource {
         return 0;
     }
 
+    @SuppressWarnings("UnusedDeclaration") //Part of JDK 7
     public Logger getParentLogger() throws SQLFeatureNotSupportedException {
         throw new SQLFeatureNotSupportedException();
     }
@@ -139,6 +139,13 @@ class DriverDataSource implements DataSource {
         return false;
     }
 
+    private org.apache.tomcat.jdbc.pool.jmx.ConnectionPool getJmxPool() {
+        if(dataSourceFactory.getPool() != null){
+            return dataSourceFactory.getPool().getJmxPool();
+        }
+        return null;
+    }
+
     private Driver getDriver() throws SQLException {
         if (driver != null) {
             return driver;
@@ -151,7 +158,7 @@ class DriverDataSource implements DataSource {
             driver = findMatchingDriver(drivers);
         }
 
-        if(driver == null){
+        if(driver == null && poolProperties.getDriverClassName() != null){
             log.debug("Looking for driver for [{}] via provided className [{}]",
                     url, poolProperties.getDriverClassName());
             driver = loadDriverClass();

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.