From 7f237602f4981fb6ba23fa6f8d38b6f0d82dbde6 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 08:56:28 +0800 Subject: [PATCH 1/8] save DruidDataSource instances to SystemProperty --- .../stat/DruidDataSourceStatManager.java | 209 +++++++++++------- 1 file changed, 133 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 8e6cc4e321..99054b0fd2 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -16,8 +16,11 @@ package com.alibaba.druid.stat; import java.lang.management.ManagementFactory; +import java.lang.reflect.Method; import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.Map; +import java.util.Properties; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; @@ -35,124 +38,178 @@ import javax.management.openmbean.TabularType; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.util.ConcurrentIdentityHashMap; import com.alibaba.druid.util.JMXUtils; +@SuppressWarnings("rawtypes") public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBean { - private final static Log LOG = LogFactory.getLog(DruidDataSourceStatManager.class); + public final static String SYS_PROP_INSTANCES = "druid.dataSources"; - private final static DruidDataSourceStatManager instance = new DruidDataSourceStatManager(); + private final static Log LOG = LogFactory.getLog(DruidDataSourceStatManager.class); - private final AtomicLong resetCount = new AtomicLong(); + private final static DruidDataSourceStatManager instance = new DruidDataSourceStatManager(); + + private final AtomicLong resetCount = new AtomicLong(); // global instances - private static final ConcurrentIdentityHashMap dataSources = new ConcurrentIdentityHashMap(); + private static IdentityHashMap dataSources; - private final static String MBEAN_NAME = "com.alibaba.druid:type=DruidDataSourceStat"; + private final static String MBEAN_NAME = "com.alibaba.druid:type=DruidDataSourceStat"; public static DruidDataSourceStatManager getInstance() { return instance; } - + public static void cear() { - MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); - for (Map.Entry entry : dataSources.entrySet()) { - ObjectName objectName = entry.getValue(); - if (objectName == null) { - continue; - } - try { - mbeanServer.unregisterMBean(objectName); - } catch (JMException e) { - LOG.error(e.getMessage(), e); + IdentityHashMap dataSources = getInstances(); + + synchronized (dataSources) { + MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); + for (Object item : dataSources.entrySet()) { + Map.Entry entry = (Map.Entry) item; + ObjectName objectName = (ObjectName) entry.getValue(); + + if (objectName == null) { + continue; + } + + try { + mbeanServer.unregisterMBean(objectName); + } catch (JMException e) { + LOG.error(e.getMessage(), e); + } } + dataSources.clear(); } - dataSources.clear(); } - public synchronized static ObjectName add(DruidDataSource dataSource, String name) { - MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); - if (dataSources.size() == 0) { - try { + @SuppressWarnings("unchecked") + public static IdentityHashMap getInstances() { + if (dataSources == null) { + dataSources = getInstances0(); + } - ObjectName objectName = new ObjectName(MBEAN_NAME); - if (!mbeanServer.isRegistered(objectName)) { - mbeanServer.registerMBean(instance, objectName); + return dataSources; + } + + @SuppressWarnings("unchecked") + static IdentityHashMap getInstances0() { + Properties properties = System.getProperties(); + IdentityHashMap instances = (IdentityHashMap) properties.get(SYS_PROP_INSTANCES); + + if (instances == null) { + synchronized (properties) { + instances = (IdentityHashMap) properties.get(SYS_PROP_INSTANCES); + + if (instances == null) { + instances = new IdentityHashMap(); + properties.put(SYS_PROP_INSTANCES, instances); } - } catch (JMException ex) { - LOG.error("register mbean error", ex); } } - ObjectName objectName = null; - if (name != null) { - try { - objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + name); - mbeanServer.registerMBean(dataSource, objectName); - } catch (JMException ex) { - LOG.error("register mbean error", ex); - objectName = null; - } - } + return instances; + } - if (objectName == null) { - try { - int id = System.identityHashCode(dataSource); - objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + id); - mbeanServer.registerMBean(dataSource, objectName); - } catch (JMException ex) { - LOG.error("register mbean error", ex); - objectName = null; - } - } + public synchronized static ObjectName add(Object dataSource, String name) { + final IdentityHashMap dataSources = getInstances(); - dataSources.put(dataSource, objectName); - return objectName; + synchronized (dataSources) { + MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); + if (dataSources.size() == 0) { + try { + + ObjectName objectName = new ObjectName(MBEAN_NAME); + if (!mbeanServer.isRegistered(objectName)) { + mbeanServer.registerMBean(instance, objectName); + } + } catch (JMException ex) { + LOG.error("register mbean error", ex); + } + } + + ObjectName objectName = null; + if (name != null) { + try { + objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + name); + mbeanServer.registerMBean(dataSource, objectName); + } catch (JMException ex) { + LOG.error("register mbean error", ex); + objectName = null; + } + } + + if (objectName == null) { + try { + int id = System.identityHashCode(dataSource); + objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + id); + mbeanServer.registerMBean(dataSource, objectName); + } catch (JMException ex) { + LOG.error("register mbean error", ex); + objectName = null; + } + } + + dataSources.put(dataSource, objectName); + return objectName; + } } public synchronized static void remove(DruidDataSource dataSource) { - ObjectName objectName = dataSources.remove(dataSource); + IdentityHashMap dataSources = getInstances(); - if (objectName == null) { - objectName = dataSource.getObjectName(); - } + synchronized (dataSources) { + ObjectName objectName = (ObjectName) dataSources.remove(dataSource); - if (objectName == null) { - LOG.error("unregister mbean failed. url " + dataSource.getUrl()); - return; - } - - MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); - - if (objectName != null) { - try { - mbeanServer.unregisterMBean(objectName); - } catch (JMException ex) { - LOG.error("unregister mbean error", ex); + if (objectName == null) { + objectName = dataSource.getObjectName(); } - } - if (dataSources.size() == 0) { - try { - mbeanServer.unregisterMBean(new ObjectName(MBEAN_NAME)); - } catch (JMException ex) { - LOG.error("unregister mbean error", ex); + if (objectName == null) { + LOG.error("unregister mbean failed. url " + dataSource.getUrl()); + return; + } + + MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); + + if (objectName != null) { + try { + mbeanServer.unregisterMBean(objectName); + } catch (JMException ex) { + LOG.error("unregister mbean error", ex); + } + } + + if (dataSources.size() == 0) { + try { + mbeanServer.unregisterMBean(new ObjectName(MBEAN_NAME)); + } catch (JMException ex) { + LOG.error("unregister mbean error", ex); + } } } } + @SuppressWarnings("unchecked") public static Set getDruidDataSourceInstances() { return dataSources.keySet(); } public void reset() { - final Set dataSources = getDruidDataSourceInstances(); - for (DruidDataSource dataSource : dataSources) { - dataSource.resetStat(); - } + IdentityHashMap dataSources = getInstances(); - resetCount.incrementAndGet(); + synchronized (dataSources) { + for (Object item : dataSources.keySet()) { + try { + Method method = item.getClass().getMethod("resetStat"); + method.invoke(item); + } catch (Exception e) { + LOG.error("resetStat error", e); + } + } + + resetCount.incrementAndGet(); + } } public long getResetCount() { From 6f314a1b82cfa1ae9a2dfb58bdc6e578392b7e26 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 09:29:25 +0800 Subject: [PATCH 2/8] support jndi & osgi datasources --- .../alibaba/druid/pool/DruidDataSource.java | 76 +++++++++++++++++- .../stat/DruidDataSourceStatManager.java | 78 ++----------------- .../druid/util/DruidDataSourceUtils.java | 48 ++++++++++++ 3 files changed, 131 insertions(+), 71 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 75735e20a5..bbd6f3cb25 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.ConcurrentModificationException; import java.util.Date; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; @@ -32,6 +33,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Condition; +import javax.management.JMException; import javax.management.ObjectName; import javax.naming.NamingException; import javax.naming.Reference; @@ -64,6 +66,7 @@ import com.alibaba.druid.stat.JdbcDataSourceStat; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; import com.alibaba.druid.util.IOUtils; +import com.alibaba.druid.util.JMXUtils; import com.alibaba.druid.util.JdbcUtils; /** @@ -72,7 +75,7 @@ import com.alibaba.druid.util.JdbcUtils; */ public class DruidDataSource extends DruidAbstractDataSource implements DruidDataSourceMBean, ManagedDataSource, Referenceable, Closeable, Cloneable, ConnectionPoolDataSource { - private final static Log LOG = LogFactory.getLog(DruidDataSource.class); + private final static Log LOG = LogFactory.getLog(DruidDataSource.class); private static final long serialVersionUID = 1L; @@ -1514,4 +1517,75 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat return x; } + public Map getStatData() { + try { + Map map = new HashMap(); + + // 0 - 4 + map.put("Name", this.getName()); + map.put("URL", this.getUrl()); + map.put("CreateCount", this.getCreateCount()); + map.put("DestroyCount", this.getDestroyCount()); + map.put("ConnectCount", this.getConnectCount()); + + // 5 - 9 + map.put("CloseCount", this.getCloseCount()); + map.put("ActiveCount", this.getActivePeak()); + map.put("PoolingCount", this.getPoolingCount()); + map.put("LockQueueLength", this.getLockQueueLength()); + map.put("WaitThreadCount", this.getNotEmptyWaitThreadPeak()); + + // 10 - 14 + map.put("InitialSize", this.getInitialSize()); + map.put("MaxActive", this.getMaxActive()); + map.put("MinIdle", this.getMinIdle()); + map.put("PoolPreparedStatements", this.isPoolPreparedStatements()); + map.put("TestOnBorrow", this.isTestOnBorrow()); + + // 15 - 19 + map.put("TestOnReturn", this.isTestOnReturn()); + map.put("MinEvictableIdleTimeMillis", this.getMinEvictableIdleTimeMillis()); + map.put("ConnectErrorCount", this.getConnectErrorCount()); + map.put("CreateTimespanMillis", this.getCreateTimespanMillis()); + map.put("DbType", this.getDbType()); + + // 20 - 24 + map.put("ValidationQuery", this.getValidationQuery()); + map.put("ValidationQueryTimeout", this.getValidationQueryTimeout()); + map.put("DriverClassName", this.getDriverClassName()); + map.put("Username", this.getUsername()); + map.put("RemoveAbandonedCount", this.getRemoveAbandonedCount()); + + // 25 - 29 + map.put("NotEmptyWaitCount", this.getNotEmptyWaitCount()); + map.put("NotEmptyWaitNanos", this.getNotEmptyWaitNanos()); + map.put("ErrorCount", this.getErrorCount()); + map.put("ReusePreparedStatementCount", this.getCachedPreparedStatementHitCount()); + map.put("StartTransactionCount", this.getStartTransactionCount()); + + // 30 - 34 + map.put("CommitCount", this.getCommitCount()); + map.put("RollbackCount", this.getRollbackCount()); + map.put("LastError", JMXUtils.getErrorCompositeData(this.getLastError())); + map.put("LastCreateError", JMXUtils.getErrorCompositeData(this.getLastCreateError())); + map.put("PreparedStatementCacheDeleteCount", this.getCachedPreparedStatementDeleteCount()); + + // 35 - 39 + map.put("PreparedStatementCacheAccessCount", this.getCachedPreparedStatementAccessCount()); + map.put("PreparedStatementCacheMissCount", this.getCachedPreparedStatementMissCount()); + map.put("PreparedStatementCacheHitCount", this.getCachedPreparedStatementHitCount()); + map.put("PreparedStatementCacheCurrentCount", this.getCachedPreparedStatementCount()); + map.put("Version", this.getVersion()); + + // 40 - + map.put("LastErrorTime", this.getLastErrorTime()); + map.put("LastCreateErrorTime", this.getLastCreateErrorTime()); + map.put("CreateErrorCount", this.getCreateErrorCount()); + map.put("DiscardCount", this.getDiscardCount()); + + return map; + } catch (JMException ex) { + throw new IllegalStateException("getStatData error", ex); + } + } } diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 99054b0fd2..470df4bd4a 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -17,7 +17,6 @@ package com.alibaba.druid.stat; import java.lang.management.ManagementFactory; import java.lang.reflect.Method; -import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; import java.util.Properties; @@ -38,6 +37,7 @@ import javax.management.openmbean.TabularType; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; +import com.alibaba.druid.util.DruidDataSourceUtils; import com.alibaba.druid.util.JMXUtils; @SuppressWarnings("rawtypes") @@ -155,18 +155,18 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe } } - public synchronized static void remove(DruidDataSource dataSource) { + public synchronized static void remove(Object dataSource) { IdentityHashMap dataSources = getInstances(); synchronized (dataSources) { ObjectName objectName = (ObjectName) dataSources.remove(dataSource); if (objectName == null) { - objectName = dataSource.getObjectName(); + objectName = DruidDataSourceUtils.getObjectName(dataSource); } if (objectName == null) { - LOG.error("unregister mbean failed. url " + dataSource.getUrl()); + LOG.error("unregister mbean failed. url " + DruidDataSourceUtils.getUrl(dataSource)); return; } @@ -223,80 +223,18 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe TabularType tabularType = new TabularType("DruidDataSourceStat", "DruidDataSourceStat", rowType, indexNames); TabularData data = new TabularDataSupport(tabularType); - final Set dataSources = getDruidDataSourceInstances(); - for (DruidDataSource dataSource : dataSources) { + final Set dataSources = getInstances().keySet(); + for (Object dataSource : dataSources) { data.put(getCompositeData(dataSource)); } return data; } - public CompositeDataSupport getCompositeData(DruidDataSource dataSource) throws JMException { + public CompositeDataSupport getCompositeData(Object dataSource) throws JMException { CompositeType rowType = getDruidDataSourceCompositeType(); - Map map = new HashMap(); - - // 0 - 4 - map.put("Name", dataSource.getName()); - map.put("URL", dataSource.getUrl()); - map.put("CreateCount", dataSource.getCreateCount()); - map.put("DestroyCount", dataSource.getDestroyCount()); - map.put("ConnectCount", dataSource.getConnectCount()); - - // 5 - 9 - map.put("CloseCount", dataSource.getCloseCount()); - map.put("ActiveCount", dataSource.getActivePeak()); - map.put("PoolingCount", dataSource.getPoolingCount()); - map.put("LockQueueLength", dataSource.getLockQueueLength()); - map.put("WaitThreadCount", dataSource.getNotEmptyWaitThreadPeak()); - - // 10 - 14 - map.put("InitialSize", dataSource.getInitialSize()); - map.put("MaxActive", dataSource.getMaxActive()); - map.put("MinIdle", dataSource.getMinIdle()); - map.put("PoolPreparedStatements", dataSource.isPoolPreparedStatements()); - map.put("TestOnBorrow", dataSource.isTestOnBorrow()); - - // 15 - 19 - map.put("TestOnReturn", dataSource.isTestOnReturn()); - map.put("MinEvictableIdleTimeMillis", dataSource.getMinEvictableIdleTimeMillis()); - map.put("ConnectErrorCount", dataSource.getConnectErrorCount()); - map.put("CreateTimespanMillis", dataSource.getCreateTimespanMillis()); - map.put("DbType", dataSource.getDbType()); - - // 20 - 24 - map.put("ValidationQuery", dataSource.getValidationQuery()); - map.put("ValidationQueryTimeout", dataSource.getValidationQueryTimeout()); - map.put("DriverClassName", dataSource.getDriverClassName()); - map.put("Username", dataSource.getUsername()); - map.put("RemoveAbandonedCount", dataSource.getRemoveAbandonedCount()); - - // 25 - 29 - map.put("NotEmptyWaitCount", dataSource.getNotEmptyWaitCount()); - map.put("NotEmptyWaitNanos", dataSource.getNotEmptyWaitNanos()); - map.put("ErrorCount", dataSource.getErrorCount()); - map.put("ReusePreparedStatementCount", dataSource.getCachedPreparedStatementHitCount()); - map.put("StartTransactionCount", dataSource.getStartTransactionCount()); - - // 30 - 34 - map.put("CommitCount", dataSource.getCommitCount()); - map.put("RollbackCount", dataSource.getRollbackCount()); - map.put("LastError", JMXUtils.getErrorCompositeData(dataSource.getLastError())); - map.put("LastCreateError", JMXUtils.getErrorCompositeData(dataSource.getLastCreateError())); - map.put("PreparedStatementCacheDeleteCount", dataSource.getCachedPreparedStatementDeleteCount()); - - // 35 - 39 - map.put("PreparedStatementCacheAccessCount", dataSource.getCachedPreparedStatementAccessCount()); - map.put("PreparedStatementCacheMissCount", dataSource.getCachedPreparedStatementMissCount()); - map.put("PreparedStatementCacheHitCount", dataSource.getCachedPreparedStatementHitCount()); - map.put("PreparedStatementCacheCurrentCount", dataSource.getCachedPreparedStatementCount()); - map.put("Version", dataSource.getVersion()); - - // 40 - - map.put("LastErrorTime", dataSource.getLastErrorTime()); - map.put("LastCreateErrorTime", dataSource.getLastCreateErrorTime()); - map.put("CreateErrorCount", dataSource.getCreateErrorCount()); - map.put("DiscardCount", dataSource.getDiscardCount()); + Map map = DruidDataSourceUtils.getStatData(dataSource); return new CompositeDataSupport(rowType, map); } diff --git a/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java b/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java new file mode 100644 index 0000000000..5d78c0ba9c --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java @@ -0,0 +1,48 @@ +package com.alibaba.druid.util; + +import java.lang.reflect.Method; +import java.util.Map; + +import javax.management.ObjectName; + +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; + +public class DruidDataSourceUtils { + + private final static Log LOG = LogFactory.getLog(DruidDataSourceUtils.class); + + public static String getUrl(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("getUrl"); + Object obj = method.invoke(druidDatasource); + return (String) obj; + } catch (Exception e) { + LOG.error("getUrl error", e); + return null; + } + } + + public static ObjectName getObjectName(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("getObjectName"); + Object obj = method.invoke(druidDatasource); + return (ObjectName) obj; + } catch (Exception e) { + LOG.error("getObjectName error", e); + return null; + } + } + + @SuppressWarnings("unchecked") + public static Map getStatData(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("getStatData"); + Object obj = method.invoke(druidDatasource); + return (Map) obj; + } catch (Exception e) { + LOG.error("getStatData error", e); + return null; + } + } +} From bc2254d76737483f5101ae5262cabc4f2dc27d97 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 09:34:45 +0800 Subject: [PATCH 3/8] rename method --- .../alibaba/druid/pool/DruidDataSource.java | 4 ++-- .../stat/DruidDataSourceStatManager.java | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index bbd6f3cb25..7c93369a95 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -421,7 +421,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat initedLatch.await(); initedTime = new Date(); - ObjectName objectName = DruidDataSourceStatManager.add(this, this.name); + ObjectName objectName = DruidDataSourceStatManager.addDataSource(this, this.name); this.setObjectName(objectName); if (connectError != null && poolingCount == 0) { @@ -777,7 +777,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } poolingCount = 0; - DruidDataSourceStatManager.remove(this); + DruidDataSourceStatManager.removeDataSource(this); enable = false; notEmpty.signalAll(); diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 470df4bd4a..ca8b1e7f45 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -111,12 +111,12 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe return instances; } - public synchronized static ObjectName add(Object dataSource, String name) { - final IdentityHashMap dataSources = getInstances(); + public synchronized static ObjectName addDataSource(Object dataSource, String name) { + final IdentityHashMap instances = getInstances(); - synchronized (dataSources) { + synchronized (instances) { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); - if (dataSources.size() == 0) { + if (instances.size() == 0) { try { ObjectName objectName = new ObjectName(MBEAN_NAME); @@ -150,16 +150,16 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe } } - dataSources.put(dataSource, objectName); + instances.put(dataSource, objectName); return objectName; } } - public synchronized static void remove(Object dataSource) { - IdentityHashMap dataSources = getInstances(); + public synchronized static void removeDataSource(Object dataSource) { + IdentityHashMap instances = getInstances(); - synchronized (dataSources) { - ObjectName objectName = (ObjectName) dataSources.remove(dataSource); + synchronized (instances) { + ObjectName objectName = (ObjectName) instances.remove(dataSource); if (objectName == null) { objectName = DruidDataSourceUtils.getObjectName(dataSource); @@ -180,7 +180,7 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe } } - if (dataSources.size() == 0) { + if (instances.size() == 0) { try { mbeanServer.unregisterMBean(new ObjectName(MBEAN_NAME)); } catch (JMException ex) { From c75cd354b1c6a4a9a29d442e8cf83dbc91be0f56 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 10:14:28 +0800 Subject: [PATCH 4/8] refactor DruidDataSourceStatFacade --- .../alibaba/druid/pool/DruidDataSource.java | 82 ++++++- .../DruidDataSourceStatDefaultStrategy.java | 202 ------------------ .../DruidDataSourceStatJNDIStatStrategy.java | 178 --------------- .../stat/DruidDataSourceStatManager.java | 2 +- .../stat/DruidDataSourceStatStrategy.java | 27 --- .../DruidDataSourceStatStrategyContext.java | 54 ----- .../druid/stat/DruidStatManagerFacade.java | 169 +++++++++++---- .../druid/util/DruidDataSourceUtils.java | 75 ++++++- 8 files changed, 286 insertions(+), 503 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/stat/DruidDataSourceStatDefaultStrategy.java delete mode 100644 src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java delete mode 100644 src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategy.java delete mode 100644 src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategyContext.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 7c93369a95..c52f27a26a 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -63,6 +63,7 @@ import com.alibaba.druid.proxy.jdbc.DataSourceProxyConfig; import com.alibaba.druid.proxy.jdbc.TransactionInfo; import com.alibaba.druid.stat.DruidDataSourceStatManager; import com.alibaba.druid.stat.JdbcDataSourceStat; +import com.alibaba.druid.stat.JdbcSqlStat; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; import com.alibaba.druid.util.IOUtils; @@ -1517,7 +1518,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat return x; } - public Map getStatData() { + public Map getStatDataForMBean() { try { Map map = new HashMap(); @@ -1588,4 +1589,83 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat throw new IllegalStateException("getStatData error", ex); } } + + public Map getStatData() { + Map dataMap = new LinkedHashMap(); + + dataMap.put("Identity", System.identityHashCode(this)); + dataMap.put("Name", this.getName()); + dataMap.put("DbType", this.getDbType()); + dataMap.put("DriverClassName", this.getDriverClassName()); + + dataMap.put("URL", this.getUrl()); + dataMap.put("UserName", this.getUsername()); + dataMap.put("FilterClassNames", this.getFilterClassNames()); + + dataMap.put("WaitThreadCount", this.getWaitThreadCount()); + dataMap.put("NotEmptyWaitCount", this.getNotEmptyWaitCount()); + dataMap.put("NotEmptyWaitMillis", this.getNotEmptyWaitMillis()); + + dataMap.put("PoolingCount", this.getPoolingCount()); + dataMap.put("PoolingPeak", this.getPoolingPeak()); + dataMap.put("PoolingPeakTime", + this.getPoolingPeakTime() == null ? null : this.getPoolingPeakTime().toString()); + + dataMap.put("ActiveCount", this.getActiveCount()); + dataMap.put("ActivePeak", this.getActivePeak()); + dataMap.put("ActivePeakTime", + this.getActivePeakTime() == null ? null : this.getActivePeakTime().toString()); + + dataMap.put("InitialSize", this.getInitialSize()); + dataMap.put("MinIdle", this.getMinIdle()); + dataMap.put("MaxActive", this.getMaxActive()); + + dataMap.put("QueryTimeout", this.getQueryTimeout()); + dataMap.put("TransactionQueryTimeout", this.getTransactionQueryTimeout()); + dataMap.put("LoginTimeout", this.getLoginTimeout()); + dataMap.put("ValidConnectionCheckerClassName", this.getValidConnectionCheckerClassName()); + dataMap.put("ExceptionSorterClassName", this.getExceptionSorterClassName()); + + dataMap.put("TestOnBorrow", this.isTestOnBorrow()); + dataMap.put("TestOnReturn", this.isTestOnReturn()); + dataMap.put("TestWhileIdle", this.isTestWhileIdle()); + + dataMap.put("DefaultAutoCommit", this.isDefaultAutoCommit()); + dataMap.put("DefaultReadOnly", this.isDefaultAutoCommit()); + dataMap.put("DefaultTransactionIsolation", this.getDefaultTransactionIsolation()); + + dataMap.put("LogicConnectCount", this.getConnectCount()); + dataMap.put("LogicCloseCount", this.getCloseCount()); + dataMap.put("LogicConnectErrorCount", this.getConnectErrorCount()); + + dataMap.put("PhysicalConnectCount", this.getCreateCount()); + dataMap.put("PhysicalCloseCount", this.getDestroyCount()); + dataMap.put("PhysicalConnectErrorCount", this.getCreateErrorCount()); + + dataMap.put("ExecuteCount", this.getExecuteCount()); + dataMap.put("ErrorCount", this.getErrorCount()); + dataMap.put("CommitCount", this.getCommitCount()); + dataMap.put("RollbackCount", this.getRollbackCount()); + + dataMap.put("PSCacheAccessCount", this.getCachedPreparedStatementAccessCount()); + dataMap.put("PSCacheHitCount", this.getCachedPreparedStatementHitCount()); + dataMap.put("PSCacheMissCount", this.getCachedPreparedStatementMissCount()); + + dataMap.put("StartTransactionCount", this.getStartTransactionCount()); + dataMap.put("TransactionHistogram", this.getTransactionHistogramValues()); + + dataMap.put("ConnectionHoldTimeHistogram", + this.getDataSourceStat().getConnectionHoldHistogram().toArray()); + dataMap.put("RemoveAbandoned", this.isRemoveAbandoned()); + + return dataMap; + } + + public JdbcSqlStat getSqlStat(int sqlId) { + return this.getDataSourceStat().getSqlStat(sqlId); + } + + public Map getSqlStatMap() { + return this.getDataSourceStat().getSqlStatMap(); + } } diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatDefaultStrategy.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatDefaultStrategy.java deleted file mode 100644 index d2a107a65a..0000000000 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatDefaultStrategy.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.alibaba.druid.stat; - -import java.sql.Driver; -import java.sql.DriverManager; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.management.JMException; - -import com.alibaba.druid.VERSION; -import com.alibaba.druid.pool.DruidDataSource; - -public class DruidDataSourceStatDefaultStrategy implements DruidDataSourceStatStrategy { - - private Set getDruidDataSourceInstances() { - return DruidDataSourceStatManager.getDruidDataSourceInstances(); - } - - public void resetDataSourceStat() { - DruidDataSourceStatManager.getInstance().reset(); - } - - public void resetSqlStat() { - JdbcStatManager.getInstance().reset(); - } - - public void resetAll() { - resetSqlStat(); - resetDataSourceStat(); - } - - public JdbcSqlStat getSqlStatById(Integer id) { - for (DruidDataSource ds : getDruidDataSourceInstances()) { - JdbcSqlStat sqlStat = ds.getDataSourceStat().getSqlStat(id); - if (sqlStat != null) return sqlStat; - } - return null; - } - - public Map getDataSourceStatData(Integer id) { - if (id == null) { - return null; - } - DruidDataSource datasource = getDruidDataSourceById(id); - return datasource == null ? null : dataSourceToMapData(datasource); - } - - public DruidDataSource getDruidDataSourceById(Integer identity) { - if (identity == null) { - return null; - } - - for (DruidDataSource datasource : getDruidDataSourceInstances()) { - if (System.identityHashCode(datasource) == identity) { - return datasource; - } - } - return null; - } - - public List> getSqlStatDataList() { - List> result = new ArrayList>(); - for (DruidDataSource datasource : getDruidDataSourceInstances()) { - for (JdbcSqlStat sqlStat : datasource.getDataSourceStat().getSqlStatMap().values()) { - if (sqlStat.getExecuteCount() == 0 && sqlStat.getRunningCount() == 0) { - continue; - } - - result.add(getSqlStatData(sqlStat)); - } - } - return result; - } - - public Map getSqlStatData(Integer id) { - if (id == null) { - return null; - } - JdbcSqlStat sqlStat = getSqlStatById(id); - return sqlStat == null ? null : getSqlStatData(sqlStat); - } - - private Map getSqlStatData(JdbcSqlStat sqlStat) { - try { - return sqlStat.getData(); - } catch (JMException e) { - } - return null; - } - - public List getDataSourceStatList() { - List datasourceList = new ArrayList(); - for (DruidDataSource dataSource : getDruidDataSourceInstances()) { - datasourceList.add(dataSourceToMapData(dataSource)); - } - return datasourceList; - } - - public Map returnJSONBasicStat() { - Map dataMap = new LinkedHashMap(); - dataMap.put("Version", VERSION.getVersionNumber()); - dataMap.put("Drivers", getDriversData()); - return dataMap; - } - - private List getDriversData() { - List drivers = new ArrayList(); - for (Enumeration e = DriverManager.getDrivers(); e.hasMoreElements();) { - Driver driver = e.nextElement(); - drivers.add(driver.getClass().getName()); - } - return drivers; - } - - public List> getPoolingConnectionInfoByDataSourceId(Integer id) { - DruidDataSource datasource = getDruidDataSourceById(id); - if (datasource == null) return null; - return datasource.getPoolingConnectionInfo(); - } - - public List getActiveConnectionStackTraceByDataSourceId(Integer id) { - DruidDataSource datasource = getDruidDataSourceById(id); - if (datasource == null || !datasource.isRemoveAbandoned()) return null; - - return datasource.getActiveConnectionStackTrace(); - } - - private Map dataSourceToMapData(DruidDataSource dataSource) { - - Map dataMap = new LinkedHashMap(); - dataMap.put("Identity", System.identityHashCode(dataSource)); - dataMap.put("Name", dataSource.getName()); - dataMap.put("DbType", dataSource.getDbType()); - dataMap.put("DriverClassName", dataSource.getDriverClassName()); - - dataMap.put("URL", dataSource.getUrl()); - dataMap.put("UserName", dataSource.getUsername()); - dataMap.put("FilterClassNames", dataSource.getFilterClassNames()); - - dataMap.put("WaitThreadCount", dataSource.getWaitThreadCount()); - dataMap.put("NotEmptyWaitCount", dataSource.getNotEmptyWaitCount()); - dataMap.put("NotEmptyWaitMillis", dataSource.getNotEmptyWaitMillis()); - - dataMap.put("PoolingCount", dataSource.getPoolingCount()); - dataMap.put("PoolingPeak", dataSource.getPoolingPeak()); - dataMap.put("PoolingPeakTime", - dataSource.getPoolingPeakTime() == null ? null : dataSource.getPoolingPeakTime().toString()); - - dataMap.put("ActiveCount", dataSource.getActiveCount()); - dataMap.put("ActivePeak", dataSource.getActivePeak()); - dataMap.put("ActivePeakTime", - dataSource.getActivePeakTime() == null ? null : dataSource.getActivePeakTime().toString()); - - dataMap.put("InitialSize", dataSource.getInitialSize()); - dataMap.put("MinIdle", dataSource.getMinIdle()); - dataMap.put("MaxActive", dataSource.getMaxActive()); - - dataMap.put("QueryTimeout", dataSource.getQueryTimeout()); - dataMap.put("TransactionQueryTimeout", dataSource.getTransactionQueryTimeout()); - dataMap.put("LoginTimeout", dataSource.getLoginTimeout()); - dataMap.put("ValidConnectionCheckerClassName", dataSource.getValidConnectionCheckerClassName()); - dataMap.put("ExceptionSorterClassName", dataSource.getExceptionSorterClassName()); - - dataMap.put("TestOnBorrow", dataSource.isTestOnBorrow()); - dataMap.put("TestOnReturn", dataSource.isTestOnReturn()); - dataMap.put("TestWhileIdle", dataSource.isTestWhileIdle()); - - dataMap.put("DefaultAutoCommit", dataSource.isDefaultAutoCommit()); - dataMap.put("DefaultReadOnly", dataSource.isDefaultAutoCommit()); - dataMap.put("DefaultTransactionIsolation", dataSource.getDefaultTransactionIsolation()); - - dataMap.put("LogicConnectCount", dataSource.getConnectCount()); - dataMap.put("LogicCloseCount", dataSource.getCloseCount()); - dataMap.put("LogicConnectErrorCount", dataSource.getConnectErrorCount()); - - dataMap.put("PhysicalConnectCount", dataSource.getCreateCount()); - dataMap.put("PhysicalCloseCount", dataSource.getDestroyCount()); - dataMap.put("PhysicalConnectErrorCount", dataSource.getCreateErrorCount()); - - dataMap.put("ExecuteCount", dataSource.getExecuteCount()); - dataMap.put("ErrorCount", dataSource.getErrorCount()); - dataMap.put("CommitCount", dataSource.getCommitCount()); - dataMap.put("RollbackCount", dataSource.getRollbackCount()); - - dataMap.put("PSCacheAccessCount", dataSource.getCachedPreparedStatementAccessCount()); - dataMap.put("PSCacheHitCount", dataSource.getCachedPreparedStatementHitCount()); - dataMap.put("PSCacheMissCount", dataSource.getCachedPreparedStatementMissCount()); - - dataMap.put("StartTransactionCount", dataSource.getStartTransactionCount()); - dataMap.put("TransactionHistogram", dataSource.getTransactionHistogramValues()); - - dataMap.put("ConnectionHoldTimeHistogram", - dataSource.getDataSourceStat().getConnectionHoldHistogram().toArray()); - dataMap.put("RemoveAbandoned", dataSource.isRemoveAbandoned()); - - return dataMap; - } -} diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java deleted file mode 100644 index f815aa9b97..0000000000 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.alibaba.druid.stat; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.util.ReflectionUtils; - -public class DruidDataSourceStatJNDIStatStrategy implements DruidDataSourceStatStrategy { - - private final static Log LOG = LogFactory.getLog(DruidDataSourceStatJNDIStatStrategy.class); - - private final static List strategyList = new ArrayList(); - - private final static HashMap> classMethodHM = new HashMap>(); - - public DruidDataSourceStatJNDIStatStrategy(){ - init(); - } - - private void init() { - try { - // cache the class - String className = "com.alibaba.druid.stat.DruidDataSourceStatDefaultStrategy"; - Class clazzFromWebContainer = ReflectionUtils.getClassFromWebContainer(className); - Class clazzFromCurClassLoader = ReflectionUtils.getClassFromCurrentClassLoader(className); - if (clazzFromCurClassLoader != null) { - Object clazzFromCurClassLoaderInstance = clazzFromCurClassLoader.newInstance(); - if (!strategyList.contains(clazzFromCurClassLoaderInstance)) { - strategyList.add(clazzFromCurClassLoaderInstance); - } - } - if (clazzFromWebContainer != null) { - Object clazzFromWebContainerInstance = clazzFromWebContainer.newInstance(); - if (!strategyList.contains(clazzFromWebContainerInstance)) { - if (clazzFromCurClassLoader != null && clazzFromWebContainer != clazzFromCurClassLoader) { - strategyList.add(clazzFromWebContainerInstance); - } - } - } - } catch (Exception e) { - LOG.error(e.getMessage(), e); - } - } - - private Object invoke(String methodName, Integer id) { - Object result = null; - try { - HashMap hm = null; - Object invokeRes = null; - Object obj = null; - Method method = null; - for (int i = 0; i < strategyList.size(); i++) { - obj = strategyList.get(i); - hm = classMethodHM.get(obj); - if (hm != null) { - if (hm.containsKey(methodName)) { - method = hm.get(methodName); - if (id == null) { - invokeRes = ReflectionUtils.callObjectMethod(obj, method); - } else { - invokeRes = ReflectionUtils.callObjectMethod(obj, method, id); - } - result = invokeMapResHandler(result, invokeRes); - } else { - result = cacheMethodAndRtnInvodeRes(hm, obj, methodName, id); - } - } else { - hm = new HashMap(); - result = cacheMethodAndRtnInvodeRes(hm, obj, methodName, id); - } - } - } catch (Exception e) { - LOG.error(e.getMessage(), e); - } - return result; - } - - private Object cacheMethodAndRtnInvodeRes(HashMap methodHM, Object obj, String methodName, - Integer id) throws Exception { - Method method = null; - Object invokeRes = null; - if (id == null) { - method = ReflectionUtils.getObjectMethod(obj, methodName); - invokeRes = ReflectionUtils.callObjectMethod(obj, method); - } else { - method = ReflectionUtils.getObjectMethod(obj, methodName, id); - invokeRes = ReflectionUtils.callObjectMethod(obj, method, id); - } - methodHM.put(methodName, method); - classMethodHM.put(obj, methodHM); - return invokeRes; - } - - @SuppressWarnings("unchecked") - private Object invokeMapResHandler(Object finalRs, Object invokeRes) { - Object res = null; - if (finalRs == null) { - if (invokeRes instanceof Map) { - res = (Map) invokeRes; - } else if (invokeRes instanceof List) { - res = (List>) invokeRes; - } else { - res = invokeRes; - } - } else { - if (invokeRes instanceof Map) { - Map finalRs_ = (Map) finalRs; - Map invokeRes_ = (Map) invokeRes; - if (invokeRes != null) finalRs_.putAll(invokeRes_); - res = finalRs_; - } else if (invokeRes instanceof List) { - List> finalRs_ = (List>) finalRs; - List> invokeRes_ = (List>) invokeRes; - if (invokeRes != null) finalRs_.addAll(invokeRes_); - res = finalRs_; - } else { - final List list = new ArrayList(); - list.add(finalRs); - list.add(invokeRes); - res = list;// merge the others class type,but in this - } - } - return res; - } - - @SuppressWarnings("unchecked") - public Map getSqlStatData(Integer id) { - return (Map) invoke("getSqlStatData", id); - } - - @SuppressWarnings("unchecked") - public Map getDataSourceStatData(Integer id) { - return (Map) invoke("getDataSourceStatData", id); - } - - @SuppressWarnings("unchecked") - public Map returnJSONBasicStat() { - return (Map) invoke("returnJSONBasicStat", null); - } - - @SuppressWarnings("unchecked") - public List> getSqlStatDataList() { - return (List>) invoke("getSqlStatDataList", null); - } - - @SuppressWarnings("unchecked") - public List getActiveConnectionStackTraceByDataSourceId(Integer id) { - return (List) invoke("getActiveConnectionStackTraceByDataSourceId", id); - } - - @SuppressWarnings("unchecked") - public List getDataSourceStatList() { - return (List) invoke("getDataSourceStatList", null); - } - - @SuppressWarnings("unchecked") - public List> getPoolingConnectionInfoByDataSourceId(Integer id) { - return (List>) invoke("getPoolingConnectionInfoByDataSourceId", id); - } - - public Object getDruidDataSourceById(Integer id) { - return invoke("getDruidDataSourceById", id); - } - - public Object getSqlStatById(Integer id) { - return invoke("getSqlStatById", id); - } - - public void resetAll() { - invoke("resetAll", null); - } - -} diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index ca8b1e7f45..9cc649ca12 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -234,7 +234,7 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe public CompositeDataSupport getCompositeData(Object dataSource) throws JMException { CompositeType rowType = getDruidDataSourceCompositeType(); - Map map = DruidDataSourceUtils.getStatData(dataSource); + Map map = DruidDataSourceUtils.getStatDataForMBean(dataSource); return new CompositeDataSupport(rowType, map); } diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategy.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategy.java deleted file mode 100644 index 74a8eabd75..0000000000 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategy.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.alibaba.druid.stat; - -import java.util.List; -import java.util.Map; - -public interface DruidDataSourceStatStrategy { - - public Map getSqlStatData(Integer id); - - public List> getSqlStatDataList(); - - public List getActiveConnectionStackTraceByDataSourceId(Integer id); - - public Map returnJSONBasicStat(); - - public List getDataSourceStatList(); - - public Map getDataSourceStatData(Integer id); - - public List> getPoolingConnectionInfoByDataSourceId(Integer id); - - public void resetAll(); - - public Object getDruidDataSourceById(Integer id); - - public Object getSqlStatById(Integer id); -} diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategyContext.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategyContext.java deleted file mode 100644 index 9df2bc2279..0000000000 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatStrategyContext.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.alibaba.druid.stat; - -import java.util.List; -import java.util.Map; - -public class DruidDataSourceStatStrategyContext { - - private DruidDataSourceStatStrategy druidDataSourceStatStrategy; - - public DruidDataSourceStatStrategyContext(DruidDataSourceStatStrategy druidDataSourceStatStrategy){ - this.druidDataSourceStatStrategy = druidDataSourceStatStrategy; - } - - public Map getSqlStatData(Integer id) { - return druidDataSourceStatStrategy.getSqlStatData(id); - } - - public List> getSqlStatDataList() { - return druidDataSourceStatStrategy.getSqlStatDataList(); - } - - public List getActiveConnectionStackTraceByDataSourceId(Integer id) { - return druidDataSourceStatStrategy.getActiveConnectionStackTraceByDataSourceId(id); - } - - public Map returnJSONBasicStat() { - return druidDataSourceStatStrategy.returnJSONBasicStat(); - } - - public List getDataSourceStatList() { - return druidDataSourceStatStrategy.getDataSourceStatList(); - } - - public Map getDataSourceStatData(Integer id) { - return druidDataSourceStatStrategy.getDataSourceStatData(id); - } - - public List> getPoolingConnectionInfoByDataSourceId(Integer id) { - return druidDataSourceStatStrategy.getPoolingConnectionInfoByDataSourceId(id); - } - - public void resetAll() { - druidDataSourceStatStrategy.resetAll(); - } - - public Object getDruidDataSourceById(Integer id) { - return druidDataSourceStatStrategy.getDruidDataSourceById(id); - } - - public Object getSqlStatById(Integer id) { - return druidDataSourceStatStrategy.getSqlStatById(id); - } - -} diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index efa89be2a2..c84ba7d3d7 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -1,7 +1,17 @@ package com.alibaba.druid.stat; +import java.sql.Driver; +import java.sql.DriverManager; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; + +import com.alibaba.druid.VERSION; +import com.alibaba.druid.util.DruidDataSourceUtils; +import com.alibaba.druid.util.JdbcSqlStatUtils; /** * 监控相关的对外数据暴露 @@ -15,16 +25,7 @@ import java.util.Map; */ public class DruidStatManagerFacade { - private final static DruidStatManagerFacade instance = new DruidStatManagerFacade(); - - private static DruidDataSourceStatStrategyContext ctx = null; - - private static DruidDataSourceStatStrategy strategy = null; - - static { - strategy = new DruidDataSourceStatJNDIStatStrategy(); - ctx = new DruidDataSourceStatStrategyContext(strategy); - } + private final static DruidStatManagerFacade instance = new DruidStatManagerFacade(); private DruidStatManagerFacade(){ } @@ -33,43 +34,135 @@ public class DruidStatManagerFacade { return instance; } - public Map getSqlStatData(Integer id) { - return ctx.getSqlStatData(id); + private Set getDruidDataSourceInstances() { + return DruidDataSourceStatManager.getInstances().keySet(); } - public List> getSqlStatDataList() { - return ctx.getSqlStatDataList(); + public void resetDataSourceStat() { + DruidDataSourceStatManager.getInstance().reset(); } - public List getActiveConnectionStackTraceByDataSourceId(Integer id) { - return ctx.getActiveConnectionStackTraceByDataSourceId(id); - } - - public Map returnJSONBasicStat() { - return ctx.returnJSONBasicStat(); - } - - public List getDataSourceStatList() { - return ctx.getDataSourceStatList(); - } - - public Map getDataSourceStatData(Integer id) { - return ctx.getDataSourceStatData(id); - } - - public List> getPoolingConnectionInfoByDataSourceId(Integer id) { - return ctx.getPoolingConnectionInfoByDataSourceId(id); + public void resetSqlStat() { + JdbcStatManager.getInstance().reset(); } public void resetAll() { - ctx.resetAll(); - } - - public Object getDruidDataSourceById(Integer id) { - return ctx.getDruidDataSourceById(id); + resetSqlStat(); + resetDataSourceStat(); } public Object getSqlStatById(Integer id) { - return ctx.getSqlStatById(id); + for (Object ds : getDruidDataSourceInstances()) { + Object sqlStat = DruidDataSourceUtils.getSqlStat(ds, id); + if (sqlStat != null) { + return sqlStat; + } + } + return null; + } + + public Map getDataSourceStatData(Integer id) { + if (id == null) { + return null; + } + + Object datasource = getDruidDataSourceById(id); + return datasource == null ? null : dataSourceToMapData(datasource); + } + + public Object getDruidDataSourceById(Integer identity) { + if (identity == null) { + return null; + } + + for (Object datasource : getDruidDataSourceInstances()) { + if (System.identityHashCode(datasource) == identity) { + return datasource; + } + } + return null; + } + + public List> getSqlStatDataList() { + List> result = new ArrayList>(); + for (Object datasource : getDruidDataSourceInstances()) { + for (Object sqlStat : DruidDataSourceUtils.getSqlStatMap(datasource).values()) { + + Map data = JdbcSqlStatUtils.getData(sqlStat); + + long executeCount = (Long) data.get("ExecuteCount"); + long runningCount = (Long) data.get("RunningCount"); + + if (executeCount == 0 && runningCount == 0) { + continue; + } + + result.add(data); + } + } + return result; + } + + public Map getSqlStatData(Integer id) { + if (id == null) { + return null; + } + + Object sqlStat = getSqlStatById(id); + + if (sqlStat == null) { + return null; + } + + return JdbcSqlStatUtils.getData(sqlStat); + } + + public List getDataSourceStatList() { + List datasourceList = new ArrayList(); + for (Object dataSource : getDruidDataSourceInstances()) { + datasourceList.add(dataSourceToMapData(dataSource)); + } + return datasourceList; + } + + public Map returnJSONBasicStat() { + Map dataMap = new LinkedHashMap(); + dataMap.put("Version", VERSION.getVersionNumber()); + dataMap.put("Drivers", getDriversData()); + return dataMap; + } + + private List getDriversData() { + List drivers = new ArrayList(); + for (Enumeration e = DriverManager.getDrivers(); e.hasMoreElements();) { + Driver driver = e.nextElement(); + drivers.add(driver.getClass().getName()); + } + return drivers; + } + + public List> getPoolingConnectionInfoByDataSourceId(Integer id) { + Object datasource = getDruidDataSourceById(id); + + if (datasource == null) { + return null; + } + + return DruidDataSourceUtils.getPoolingConnectionInfo(datasource); + } + + public List getActiveConnectionStackTraceByDataSourceId(Integer id) { + Object datasource = getDruidDataSourceById(id); + + if (datasource == null || DruidDataSourceUtils.isRemoveAbandoned(datasource)) { + return null; + } + + return DruidDataSourceUtils.getActiveConnectionStackTrace(datasource); + } + + private Map dataSourceToMapData(Object dataSource) { + + return DruidDataSourceUtils.getStatData(dataSource); } } diff --git a/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java b/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java index 5d78c0ba9c..49dc8d1741 100644 --- a/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java +++ b/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java @@ -1,6 +1,7 @@ package com.alibaba.druid.util; import java.lang.reflect.Method; +import java.util.List; import java.util.Map; import javax.management.ObjectName; @@ -22,7 +23,7 @@ public class DruidDataSourceUtils { return null; } } - + public static ObjectName getObjectName(Object druidDatasource) { try { Method method = druidDatasource.getClass().getMethod("getObjectName"); @@ -33,7 +34,41 @@ public class DruidDataSourceUtils { return null; } } - + + public static Object getSqlStat(Object druidDatasource, int sqlId) { + try { + Method method = druidDatasource.getClass().getMethod("getSqlStat", int.class); + Object obj = method.invoke(druidDatasource, sqlId); + return obj; + } catch (Exception e) { + LOG.error("getSqlStat error", e); + return null; + } + } + + public static boolean isRemoveAbandoned(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("isRemoveAbandoned"); + Object obj = method.invoke(druidDatasource); + return (Boolean) obj; + } catch (Exception e) { + LOG.error("isRemoveAbandoned error", e); + return false; + } + } + + @SuppressWarnings("unchecked") + public static Map getStatDataForMBean(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("getStatDataForMBean"); + Object obj = method.invoke(druidDatasource); + return (Map) obj; + } catch (Exception e) { + LOG.error("getStatDataForMBean error", e); + return null; + } + } + @SuppressWarnings("unchecked") public static Map getStatData(Object druidDatasource) { try { @@ -45,4 +80,40 @@ public class DruidDataSourceUtils { return null; } } + + @SuppressWarnings({ "rawtypes" }) + public static Map getSqlStatMap(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("getSqlStatMap"); + Object obj = method.invoke(druidDatasource); + return (Map) obj; + } catch (Exception e) { + LOG.error("getSqlStatMap error", e); + return null; + } + } + + @SuppressWarnings("unchecked") + public static List> getPoolingConnectionInfo(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("getPoolingConnectionInfo"); + Object obj = method.invoke(druidDatasource); + return (List>) obj; + } catch (Exception e) { + LOG.error("getPoolingConnectionInfo error", e); + return null; + } + } + + @SuppressWarnings("unchecked") + public static List getActiveConnectionStackTrace(Object druidDatasource) { + try { + Method method = druidDatasource.getClass().getMethod("getActiveConnectionStackTrace"); + Object obj = method.invoke(druidDatasource); + return (List) obj; + } catch (Exception e) { + LOG.error("getActiveConnectionStackTrace error", e); + return null; + } + } } From e4cf0667ec10d9af4f6361de6f913f3921e204bb Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 10:22:17 +0800 Subject: [PATCH 5/8] remove unused code --- .../alibaba/druid/util/ReflectionUtils.java | 151 ------------------ 1 file changed, 151 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/util/ReflectionUtils.java diff --git a/src/main/java/com/alibaba/druid/util/ReflectionUtils.java b/src/main/java/com/alibaba/druid/util/ReflectionUtils.java deleted file mode 100644 index 50c6f8baa1..0000000000 --- a/src/main/java/com/alibaba/druid/util/ReflectionUtils.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.alibaba.druid.util; - -import java.lang.reflect.Method; - -import javax.servlet.http.HttpServletRequest; - -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; - -/** - * @author sandzhang - */ -public class ReflectionUtils { - - private final static Log LOG = LogFactory.getLog(ReflectionUtils.class); - - public static Class loadClass(ClassLoader classLoader, String className) { - try { - return classLoader.loadClass(className); - } catch (ClassNotFoundException e) { - return null; - } - } - - public static Class getClassFromWebContainer(String className) { - return loadClass(HttpServletRequest.class.getClassLoader(), className); - } - - public static Class getClassFromCurrentClassLoader(String className) { - Class result = loadClass(Thread.currentThread().getContextClassLoader(), className); - try { - result = Thread.currentThread().getContextClassLoader().loadClass(className); - } catch (ClassNotFoundException e) { - LOG.error("can'r find class in current thread context classLoader ", e); - } - return result; - } - - public static Class getClassFromWebContainerOrCurrentClassLoader(String className) { - Class result = getClassFromWebContainer(className); - if (result == null) { - result = getClassFromCurrentClassLoader(className); - } - return result; - } - - public static Object callStaticMethod(Class classObject, String methodName) { - - try { - Method m = classObject.getMethod(methodName); - return m.invoke(classObject); - } catch (Exception e) { - LOG.warn("callStaticMethod fail:class=" + classObject.getName() + " method=" + methodName, e); - return null; - } - } - - public static Object callObjectMethod(Object obj, String methodName) { - try { - Method m = obj.getClass().getMethod(methodName); - return m.invoke(obj); - } catch (Exception e) { - LOG.warn("callObjectMethod fail:class=" + obj.getClass().getName() + " method=" + methodName, e); - return null; - } - } - - public static Method getObjectMethod(Object obj, String methodName) { - try { - return obj.getClass().getMethod(methodName); - } catch (Exception e) { - LOG.warn("getObjectMethod fail:class=" + obj.getClass().getName() + " method=" + methodName, e); - return null; - } - } - - public static Method getObjectMethod(Object obj, String methodName, Class... parameterTypes) { - try { - return obj.getClass().getMethod(methodName, parameterTypes); - } catch (Exception e) { - LOG.warn("getObjectMethod fail:class=" + obj.getClass().getName() + " method=" + methodName, e); - return null; - } - } - - public static Object callObjectMethod(Object obj, String methodName, Class[] parameterTypes, Object[] parameters) { - try { - Method m = getObjectMethod(obj, methodName, parameterTypes); - return m.invoke(obj, parameters); - } catch (Exception e) { - LOG.warn("callObjectMethod fail:class=" + obj.getClass().getName() + " method=" + methodName, e); - return null; - } - } - - public static Object callObjectMethod(Object obj, Method m, Object[] parameters) { - try { - return m.invoke(obj, parameters); - } catch (Exception e) { - LOG.warn("callObjectMethod fail:class=" + obj.getClass().getName() + " method=" + m.getName(), e); - return null; - } - } - - public static Object callObjectMethod(Object obj, Method m) { - try { - return m.invoke(obj); - } catch (Exception e) { - LOG.warn("callObjectMethod fail:class=" + obj.getClass().getName() + " method=" + m.getName(), e); - return null; - } - } - - public static Object callObjectMethod(Object obj, String methodName, Integer id) { - try { - Method m = obj.getClass().getMethod(methodName, Integer.class); - return m.invoke(obj, id); - } catch (Exception e) { - LOG.warn("callObjectMethod fail:class=" + obj.getClass().getName() + " method=" + methodName, e); - return null; - } - } - - public static Method getObjectMethod(Object obj, String methodName, Integer id) { - try { - return obj.getClass().getMethod(methodName, Integer.class); - } catch (Exception e) { - LOG.warn("getObjectMethod fail:class=" + obj.getClass().getName() + " method=" + methodName, e); - return null; - } - } - - public static Object callObjectMethod(Object obj, Method m, Integer id) { - try { - return m.invoke(obj, id); - } catch (Exception e) { - LOG.warn("callObjectMethod fail:class=" + obj.getClass().getName() + " method=" + m.getName(), e); - return null; - } - } - - public void getTest() { - System.out.println("dd"); - // return "test"; - } - - public static void main(String args[]) { - System.out.println(callObjectMethod(new ReflectionUtils(), "getTest")); - - } -} From 9bbc411029f85e98b1f7395fd14f946d8457084a Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 10:22:45 +0800 Subject: [PATCH 6/8] refactor DruidDataSourceStatFacade --- .../alibaba/druid/util/JdbcSqlStatUtils.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java diff --git a/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java b/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java new file mode 100644 index 0000000000..7540df8f61 --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/JdbcSqlStatUtils.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.util; + +import java.lang.reflect.Method; +import java.util.Map; + +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; + + +public class JdbcSqlStatUtils { + private final static Log LOG = LogFactory.getLog(JdbcSqlStatUtils.class); + + @SuppressWarnings("unchecked") + public static Map getData(Object jdbcSqlStat) { + try { + Method method = jdbcSqlStat.getClass().getMethod("getData"); + Object obj = method.invoke(jdbcSqlStat); + return (Map) obj; + } catch (Exception e) { + LOG.error("getData error", e); + return null; + } + } +} From be5afed48b2a19c9be6b60f529c48861d8c96b8c Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 10:24:23 +0800 Subject: [PATCH 7/8] remove unused code --- .../com/alibaba/druid/util/MySqlUtils.java | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/util/MySqlUtils.java diff --git a/src/main/java/com/alibaba/druid/util/MySqlUtils.java b/src/main/java/com/alibaba/druid/util/MySqlUtils.java deleted file mode 100644 index 464a3eb2b5..0000000000 --- a/src/main/java/com/alibaba/druid/util/MySqlUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.alibaba.druid.util; - -import java.sql.Connection; -import java.sql.SQLException; - - -public class MySqlUtils { - public static com.mysql.jdbc.Connection unwrap(Connection conn) throws SQLException { - if (conn instanceof com.mysql.jdbc.Connection) { - return (com.mysql.jdbc.Connection) conn; - } - - return conn.unwrap(com.mysql.jdbc.Connection.class); - } - - public static void ping(Connection conn) throws SQLException { - com.mysql.jdbc.Connection mysqlConn = unwrap(conn); - mysqlConn.ping(); - } -} From 60808c12924e09550cfed8469ec9f4b284b6a29e Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 12 Aug 2012 10:31:49 +0800 Subject: [PATCH 8/8] remove unused code --- .../druid/stat/service/DruidStatService.java | 115 ----------- .../stat/service/DruidStatServiceUtils.java | 40 ---- .../druid/stat/service/DruidStatStore.java | 10 - .../stat/service/dto/DataSourceInfo.java | 185 ------------------ .../druid/stat/service/dto/SqlInfo.java | 175 ----------------- .../service/impl/DruidStatMemoryStore.java | 90 --------- .../druid/bvt/statService/SqlInfoTest.java | 33 ---- 7 files changed, 648 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/stat/service/DruidStatService.java delete mode 100644 src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java delete mode 100644 src/main/java/com/alibaba/druid/stat/service/DruidStatStore.java delete mode 100644 src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java delete mode 100644 src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java delete mode 100644 src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java delete mode 100644 src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java diff --git a/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java b/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java deleted file mode 100644 index e57e69f63c..0000000000 --- a/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.alibaba.druid.stat.service; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.stat.DruidDataSourceStatManager; -import com.alibaba.druid.stat.JdbcSqlStat; -import com.alibaba.druid.stat.service.dto.DataSourceInfo; -import com.alibaba.druid.stat.service.dto.SqlInfo; -import com.alibaba.druid.stat.service.impl.DruidStatMemoryStore; - -public class DruidStatService { - - private ScheduledExecutorService scheduler; - - private ScheduledFuture collectPlan; - - private int collectPeriodSeconds = 60 * 5; - - private DruidStatStore store; - - public int getCollectPeriodSeconds() { - return collectPeriodSeconds; - } - - public void setCollectPeriodSeconds(int collectPeriodSeconds) { - this.collectPeriodSeconds = collectPeriodSeconds; - } - - public synchronized void start() { - if (store != null) { - store = new DruidStatMemoryStore(); - } - - scheduler = Executors.newSingleThreadScheduledExecutor(); - collectPlan = scheduler.scheduleAtFixedRate(new CollectTask(), collectPeriodSeconds, collectPeriodSeconds, - TimeUnit.SECONDS); - } - - public synchronized void stop() { - if (collectPlan == null) { - collectPlan.cancel(true); - } - if (scheduler != null) { - scheduler.shutdown(); - } - } - - public void collect() { - List dataSourceStatList = new ArrayList(); - for (DruidDataSource dataSource : DruidDataSourceStatManager.getDruidDataSourceInstances()) { - DataSourceInfo dataSourceStat = new DataSourceInfo(); - - dataSourceStat.setCollectTimeMillis(System.currentTimeMillis()); - - dataSourceStat.setId(dataSource.getID()); - dataSourceStat.setUrl(dataSource.getUrl()); - dataSourceStat.setDbType(dataSource.getDbType()); - - dataSourceStat.setActiveCount(dataSource.getActiveCount()); - dataSourceStat.setActivePeak(dataSource.getActivePeak()); - dataSourceStat.setCloseCount((int) dataSource.getCloseCount()); - dataSourceStat.setConnectCount((int) dataSource.getConnectCount()); - dataSourceStat.setConnectErrorCount((int) dataSource.getConnectErrorCount()); - dataSourceStat.setCreateCount((int) dataSource.getCreateCount()); - dataSourceStat.setCreateErrorCount((int) dataSource.getCreateErrorCount()); - dataSourceStat.setDestoryCount((int) dataSource.getDestroyCount()); - dataSourceStat.setExecuteCount((int) dataSource.getExecuteCount()); - dataSourceStat.setPoolingCount(dataSource.getPoolingCount()); - dataSourceStat.setConnectionHoldHistogram(dataSource.getDataSourceStat().getConnectionHistogramValues()); - dataSourceStat.setTransactionHistogram(dataSource.getTransactionHistogramValues()); - - Collection sqlStats = dataSource.getDataSourceStat().getSqlStatMap().values(); - - Map sqlStatInfoMap = new HashMap(sqlStats.size()); - for (JdbcSqlStat sqlStat : dataSource.getDataSourceStat().getSqlStatMap().values()) { - - if (sqlStat.getExecuteCount() == 0 && sqlStat.getRunningCount() == 0) { - continue; - } - - SqlInfo sqlStatInfo = DruidStatServiceUtils.createSqlInfo(sqlStat); - - SqlInfo oldsqlStatInfo = sqlStatInfoMap.get(sqlStatInfo.getSql()); - if (oldsqlStatInfo != null) { - oldsqlStatInfo.merge(sqlStatInfo); - } else { - sqlStatInfoMap.put(sqlStatInfo.getSql(), sqlStatInfo); - } - } - - dataSourceStat.setSqlList(new ArrayList(sqlStatInfoMap.values())); - - dataSourceStatList.add(dataSourceStat); - } - - store.saveDataSource(dataSourceStatList); - } - - private final class CollectTask implements Runnable { - - public void run() { - collect(); - } - } - -} diff --git a/src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java b/src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java deleted file mode 100644 index 3ce0a6948d..0000000000 --- a/src/main/java/com/alibaba/druid/stat/service/DruidStatServiceUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.alibaba.druid.stat.service; - -import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; -import com.alibaba.druid.stat.JdbcSqlStat; -import com.alibaba.druid.stat.service.dto.SqlInfo; -import com.alibaba.druid.support.logging.Log; -import com.alibaba.druid.support.logging.LogFactory; - -public class DruidStatServiceUtils { - - private final static Log LOG = LogFactory.getLog(DruidStatServiceUtils.class); - - public static SqlInfo createSqlInfo(JdbcSqlStat sqlStat) { - SqlInfo info = new SqlInfo(); - - String sql = sqlStat.getSql(); - try { - sql = ParameterizedOutputVisitorUtils.parameterize(sql, sqlStat.getDbType()); - } catch (Exception e) { - LOG.error("merge sql error", e); - } - - info.setSql(sql); - info.setExecuteCount((int) sqlStat.getExecuteCount()); - info.setRunningCount((int) sqlStat.getRunningCount()); - info.setConcurrentMax((int) sqlStat.getConcurrentMax()); - info.setErrorCount((int) sqlStat.getErrorCount()); - info.setInTransactionCount((int) sqlStat.getInTransactionCount()); - info.setFetchRowCount(sqlStat.getFetchRowCount()); - info.setUpdateCount(sqlStat.getUpdateCount()); - info.setResultSetHoldTimeMilis(sqlStat.getResultSetHoldTimeMilis()); - - info.setHisogram(sqlStat.getHistogram().toArray()); - info.setExecuteAndResultHoldTimeHistogram(sqlStat.getExecuteAndResultHoldTimeHistogram().toArray()); - info.setFetchRowCountHistogram(sqlStat.getFetchRowCountHistogram().toArray()); - info.setUpdateCountHistogram(sqlStat.getUpdateCountHistogram().toArray()); - - return info; - } -} diff --git a/src/main/java/com/alibaba/druid/stat/service/DruidStatStore.java b/src/main/java/com/alibaba/druid/stat/service/DruidStatStore.java deleted file mode 100644 index 9d0030bc63..0000000000 --- a/src/main/java/com/alibaba/druid/stat/service/DruidStatStore.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.alibaba.druid.stat.service; - -import java.util.List; - -import com.alibaba.druid.stat.service.dto.DataSourceInfo; - -public interface DruidStatStore { - - void saveDataSource(List dataSourceList); -} diff --git a/src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java b/src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java deleted file mode 100644 index b706154cb7..0000000000 --- a/src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.alibaba.druid.stat.service.dto; - -import java.util.List; - -public class DataSourceInfo { - - private long id; - private String url; - private String dbType; - - private int activeCount; - private int activePeak; - - private int poolingCount; - - private int connectCount; - private int connectErrorCount; - - private int createCount; - private int createErrorCount; - - private int executeCount; - - private int closeCount; - private int destoryCount; - - private long collectTimeMillis; - - private int[] transactionHistogram; - - private int[] connectionHoldHistogram; - - private List sqlList; - - public String getDbType() { - return dbType; - } - - public void setDbType(String dbType) { - this.dbType = dbType; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public List getSqlList() { - return sqlList; - } - - public void setSqlList(List sqlList) { - this.sqlList = sqlList; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public int[] getTransactionHistogram() { - return transactionHistogram; - } - - public void setTransactionHistogram(long[] values) { - this.transactionHistogram = new int[values.length]; - for (int i = 0; i < values.length; ++i) { - transactionHistogram[i] = (int) values[i]; - } - } - - public void setTransactionHistogram(int[] values) { - this.transactionHistogram = values; - } - - public int[] getConnectionHoldHistogram() { - return connectionHoldHistogram; - } - - public void setConnectionHoldHistogram(int[] values) { - this.connectionHoldHistogram = values; - } - - public void setConnectionHoldHistogram(long[] values) { - this.connectionHoldHistogram = new int[values.length]; - for (int i = 0; i < values.length; ++i) { - connectionHoldHistogram[i] = (int) values[i]; - } - } - - public int getActiveCount() { - return activeCount; - } - - public void setActiveCount(int activeCount) { - this.activeCount = activeCount; - } - - public int getActivePeak() { - return activePeak; - } - - public void setActivePeak(int activePeak) { - this.activePeak = activePeak; - } - - public int getPoolingCount() { - return poolingCount; - } - - public void setPoolingCount(int poolingCount) { - this.poolingCount = poolingCount; - } - - public int getConnectCount() { - return connectCount; - } - - public void setConnectCount(int connectCount) { - this.connectCount = connectCount; - } - - public int getConnectErrorCount() { - return connectErrorCount; - } - - public void setConnectErrorCount(int connectErrorCount) { - this.connectErrorCount = connectErrorCount; - } - - public int getCreateCount() { - return createCount; - } - - public void setCreateCount(int createCount) { - this.createCount = createCount; - } - - public int getCreateErrorCount() { - return createErrorCount; - } - - public void setCreateErrorCount(int createErrorCount) { - this.createErrorCount = createErrorCount; - } - - public int getExecuteCount() { - return executeCount; - } - - public void setExecuteCount(int executeCount) { - this.executeCount = executeCount; - } - - public int getCloseCount() { - return closeCount; - } - - public void setCloseCount(int closeCount) { - this.closeCount = closeCount; - } - - public int getDestoryCount() { - return destoryCount; - } - - public void setDestoryCount(int destoryCount) { - this.destoryCount = destoryCount; - } - - public long getCollectTimeMillis() { - return collectTimeMillis; - } - - public void setCollectTimeMillis(long collectTimeMillis) { - this.collectTimeMillis = collectTimeMillis; - } - -} diff --git a/src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java b/src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java deleted file mode 100644 index 86981d64de..0000000000 --- a/src/main/java/com/alibaba/druid/stat/service/dto/SqlInfo.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.alibaba.druid.stat.service.dto; - -public class SqlInfo { - - private String sql; - private int executeCount; - private int runningCount; - private int concurrentMax; - private int errorCount; - private int inTransactionCount; - - private long fetchRowCount; - private long updateCount; - - private long resultSetHoldTimeMilis; - - private int[] histogram; - - private int[] executeAndResultHoldTimeHistogram; - - private int[] updateCountHistogram; - - private int[] fetchRowCountHistogram; - - public SqlInfo(){ - - } - - public void setExecuteAndResultHoldTimeHistogram(long[] values) { - executeAndResultHoldTimeHistogram = new int[values.length]; - for (int i = 0; i < values.length; ++i) { - executeAndResultHoldTimeHistogram[i] = (int) values[i]; - } - } - - public int[] getExecuteAndResultHoldTimeHistogram() { - return executeAndResultHoldTimeHistogram; - } - - public void setFetchRowCountHistogram(long[] values) { - fetchRowCountHistogram = new int[values.length]; - for (int i = 0; i < values.length; ++i) { - fetchRowCountHistogram[i] = (int) values[i]; - } - } - - public int[] getFetchRowCountHistogram() { - return fetchRowCountHistogram; - } - - public void setUpdateCountHistogram(long[] values) { - updateCountHistogram = new int[values.length]; - for (int i = 0; i < values.length; ++i) { - updateCountHistogram[i] = (int) values[i]; - } - } - - public int[] getUpdateCountHistogram() { - return updateCountHistogram; - } - - public void setHisogram(long[] values) { - histogram = new int[values.length]; - for (int i = 0; i < values.length; ++i) { - histogram[i] = (int) values[i]; - } - } - - public int[] getHistogram() { - return histogram; - } - - public String getSql() { - return sql; - } - - public void setSql(String sql) { - this.sql = sql; - } - - public int getExecuteCount() { - return executeCount; - } - - public void setExecuteCount(int executeCount) { - this.executeCount = executeCount; - } - - public int getRunningCount() { - return runningCount; - } - - public void setRunningCount(int runningCount) { - this.runningCount = runningCount; - } - - public int getConcurrentMax() { - return concurrentMax; - } - - public void setConcurrentMax(int concurrentMax) { - this.concurrentMax = concurrentMax; - } - - public int getErrorCount() { - return errorCount; - } - - public void setErrorCount(int errorCount) { - this.errorCount = errorCount; - } - - public int getInTransactionCount() { - return inTransactionCount; - } - - public void setInTransactionCount(int inTransactionCount) { - this.inTransactionCount = inTransactionCount; - } - - public long getFetchRowCount() { - return fetchRowCount; - } - - public void setFetchRowCount(long fetchRowCount) { - this.fetchRowCount = fetchRowCount; - } - - public long getUpdateCount() { - return updateCount; - } - - public void setUpdateCount(long updateCount) { - this.updateCount = updateCount; - } - - public long getResultSetHoldTimeMilis() { - return resultSetHoldTimeMilis; - } - - public void setResultSetHoldTimeMilis(long resultSetHoldTimeMilis) { - this.resultSetHoldTimeMilis = resultSetHoldTimeMilis; - } - - public void merge(SqlInfo o) { - executeCount += o.executeCount; - runningCount += o.runningCount; - if (o.concurrentMax > concurrentMax) { - concurrentMax = o.concurrentMax; - } - errorCount += o.errorCount; - inTransactionCount += o.inTransactionCount; - - fetchRowCount += o.fetchRowCount; - updateCount += o.updateCount; - - resultSetHoldTimeMilis += o.resultSetHoldTimeMilis; - - for (int i = 0; i < histogram.length; ++i) { - this.histogram[i] += o.histogram[i]; - } - - for (int i = 0; i < executeAndResultHoldTimeHistogram.length; ++i) { - this.executeAndResultHoldTimeHistogram[i] += o.executeAndResultHoldTimeHistogram[i]; - } - - for (int i = 0; i < updateCountHistogram.length; ++i) { - this.updateCountHistogram[i] += o.updateCountHistogram[i]; - } - - for (int i = 0; i < fetchRowCountHistogram.length; ++i) { - this.fetchRowCountHistogram[i] += o.fetchRowCountHistogram[i]; - } - } -} diff --git a/src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java b/src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java deleted file mode 100644 index 27b096ae8d..0000000000 --- a/src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.alibaba.druid.stat.service.impl; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentSkipListMap; - -import com.alibaba.druid.stat.service.DruidStatStore; -import com.alibaba.druid.stat.service.dto.DataSourceInfo; - -public class DruidStatMemoryStore implements DruidStatStore { - - private ConcurrentHashMap dataSourceDataMap = new ConcurrentHashMap(); - - @Override - public void saveDataSource(List dataSourceList) { - for (DataSourceInfo dataSourceInfo : dataSourceList) { - DataSourceData data = dataSourceDataMap.get(dataSourceInfo.getId()); - - if (data == null) { - dataSourceDataMap.putIfAbsent(dataSourceInfo.getId(), new DataSourceData(dataSourceInfo.getId(), - dataSourceInfo.getUrl(), - dataSourceInfo.getDbType())); - data = dataSourceDataMap.get(dataSourceInfo.getId()); - } - - data.add(dataSourceInfo); - } - } - - public Collection scan(long dataSourceId, Long startTimeMillis, Long endTimeMillis) { - DataSourceData data = dataSourceDataMap.get(dataSourceId); - - if (data == null) { - return Collections.emptyList(); - } - - return data.scan(startTimeMillis, endTimeMillis); - } - - public static class DataSourceData { - - private final Long id; - private final String url; - private final String dbType; - - private ConcurrentSkipListMap data = new ConcurrentSkipListMap(); - - public DataSourceData(Long id, String url, String dbType){ - super(); - this.id = id; - this.url = url; - this.dbType = dbType; - } - - public Long getId() { - return id; - } - - public String getUrl() { - return url; - } - - public String getDbType() { - return dbType; - } - - public void add(DataSourceInfo dataSourceInfo) { - data.put(dataSourceInfo.getCollectTimeMillis(), dataSourceInfo); - } - - public Collection scan(Long startTimeMillis, Long endTimeMillis) { - if (data.size() == 0) { - return Collections.emptyList(); - } - - if (startTimeMillis == null) { - startTimeMillis = data.keySet().iterator().next(); - } - - if (endTimeMillis == null) { - endTimeMillis = data.descendingKeySet().iterator().next(); - } - - return data.subMap(startTimeMillis, endTimeMillis).values(); - } - } - -} diff --git a/src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java b/src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java deleted file mode 100644 index 1aa1c67554..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/statService/SqlInfoTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.alibaba.druid.bvt.statService; - -import junit.framework.Assert; -import junit.framework.TestCase; - -import com.alibaba.druid.stat.JdbcSqlStat; -import com.alibaba.druid.stat.service.DruidStatServiceUtils; -import com.alibaba.druid.stat.service.dto.SqlInfo; - -public class SqlInfoTest extends TestCase { - - public void test_0() throws Exception { - JdbcSqlStat sqlStat = new JdbcSqlStat("select 1"); - sqlStat.incrementRunningCount(); - sqlStat.incrementExecuteSuccessCount(); - - SqlInfo info = DruidStatServiceUtils.createSqlInfo(sqlStat); - - Assert.assertEquals(1, info.getRunningCount()); - Assert.assertEquals(1, info.getExecuteCount()); - - JdbcSqlStat sqlStat1 = new JdbcSqlStat("select 2"); - sqlStat1.incrementRunningCount(); - sqlStat1.incrementExecuteSuccessCount(); - - SqlInfo info1 = DruidStatServiceUtils.createSqlInfo(sqlStat); - - info.merge(info1); - - Assert.assertEquals(2, info.getRunningCount()); - Assert.assertEquals(2, info.getExecuteCount()); - } -}