diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 9906faa3ad..5646d8db3d 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -1,16 +1,33 @@ package com.alibaba.druid.stat; +import java.util.HashMap; +import java.util.Map; import java.util.Set; +import javax.management.JMException; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.SimpleType; +import javax.management.openmbean.TabularData; +import javax.management.openmbean.TabularDataSupport; +import javax.management.openmbean.TabularType; + import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.util.ConcurrentIdentityHashMap; public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBean { + private final static DruidDataSourceStatManager instance = new DruidDataSourceStatManager(); + // global instances private static final Object PRESENT = new Object(); private static final ConcurrentIdentityHashMap instances = new ConcurrentIdentityHashMap(); + public static DruidDataSourceStatManager getInstance() { + return instance; + } + public static void add(DruidDataSource dataSource) { instances.put(dataSource, PRESENT); } @@ -19,7 +36,94 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe instances.remove(dataSource); } - public static Set getInstances() { + public static Set getDruidDataSourceInstances() { return instances.keySet(); } + + public TabularData getDataSourceList() throws JMException { + CompositeType rowType = getDruidDataSourceCompositeType(); + String[] indexNames = rowType.keySet().toArray(new String[rowType.keySet().size()]); + + TabularType tabularType = new TabularType("DruidDataSourceStat", "DruidDataSourceStat", rowType, indexNames); + TabularData data = new TabularDataSupport(tabularType); + + final Set dataSources = getDruidDataSourceInstances(); + for (DruidDataSource dataSource : dataSources) { + data.put(getCompositeData(dataSource)); + } + + return data; + } + + public CompositeDataSupport getCompositeData(DruidDataSource dataSource) throws JMException { + CompositeType rowType = getDruidDataSourceCompositeType(); + + Map map = new HashMap(); + + 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()); + + map.put("CloseCount", dataSource.getCloseCount()); + map.put("ActiveCount", dataSource.getActiveCount()); + map.put("PoolingCount", dataSource.getPoolingCount()); + map.put("LockQueueLength", dataSource.getLockQueueLength()); + map.put("WaitThreadCount", dataSource.getWaitThreadCount()); + + 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()); + + 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()); + + map.put("ValidationQuery", dataSource.getValidationQuery()); + map.put("ValidationQueryTimeout", dataSource.getValidationQueryTimeout()); + map.put("DriverClassName", dataSource.getDriverClassName()); + map.put("Username", dataSource.getUsername()); + + return new CompositeDataSupport(rowType, map); + } + + private static CompositeType COMPOSITE_TYPE = null; + + public static CompositeType getDruidDataSourceCompositeType() throws JMException { + + if (COMPOSITE_TYPE != null) { + return COMPOSITE_TYPE; + } + + OpenType[] indexTypes = new OpenType[] { + // + SimpleType.STRING, SimpleType.STRING, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, // + SimpleType.LONG, SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.INTEGER, // + SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.BOOLEAN, SimpleType.BOOLEAN, // + SimpleType.BOOLEAN, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.STRING, // + SimpleType.STRING, SimpleType.INTEGER, SimpleType.STRING, SimpleType.STRING, + // + }; + + String[] indexNames = { + // + "Name", "URL", "CreateCount", "DestroyCount", "ConnectCount", // + "CloseCount", "ActiveCount", "PoolingCount", "LockQueueLength", "WaitThreadCount", // + "InitialSize", "MaxActive", "MinIdle", "PoolPreparedStatements", "TestOnBorrow", // + "TestOnReturn", "MinEvictableIdleTimeMillis", "ConnectErrorCount", "CreateTimespanMillis", "DbType", // + "ValidationQuery", "ValidationQueryTimeout", "DriverClassName", "Username" + // + }; + + String[] indexDescriptions = indexNames; + COMPOSITE_TYPE = new CompositeType("DataSourceStatistic", "DataSource Statistic", indexNames, + indexDescriptions, indexTypes); + + return COMPOSITE_TYPE; + } } diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManagerMBean.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManagerMBean.java index f4039525b3..32dfc061f6 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManagerMBean.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManagerMBean.java @@ -1,6 +1,9 @@ package com.alibaba.druid.stat; +import javax.management.JMException; +import javax.management.openmbean.TabularData; public interface DruidDataSourceStatManagerMBean { + TabularData getDataSourceList() throws JMException; } diff --git a/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java b/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java index 89529d3cc3..da0967da10 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java @@ -249,7 +249,7 @@ public class JdbcStatManager implements JdbcStatManagerMBean { } } - final Set dataSources = DruidDataSourceStatManager.getInstances(); + final Set dataSources = DruidDataSourceStatManager.getDruidDataSourceInstances(); for (DruidDataSource dataSource : dataSources) { data.put(dataSource.getCompositeData()); } @@ -298,7 +298,7 @@ public class JdbcStatManager implements JdbcStatManagerMBean { } } - for (DruidDataSource instance : DruidDataSourceStatManager.getInstances()) { + for (DruidDataSource instance : DruidDataSourceStatManager.getDruidDataSourceInstances()) { for (Filter filter : instance.getProxyFilters()) { if (filter instanceof StatFilter) { StatFilter countFilter = (StatFilter) filter; @@ -332,7 +332,7 @@ public class JdbcStatManager implements JdbcStatManagerMBean { } } - for (DruidDataSource instance : DruidDataSourceStatManager.getInstances()) { + for (DruidDataSource instance : DruidDataSourceStatManager.getDruidDataSourceInstances()) { for (Filter filter : instance.getProxyFilters()) { if (filter instanceof StatFilter) { StatFilter countFilter = (StatFilter) filter; diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestStat.java b/src/test/java/com/alibaba/druid/bvt/pool/TestStat.java index f951ddd6f9..279d10d618 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestStat.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestStat.java @@ -8,6 +8,7 @@ import junit.framework.Assert; import junit.framework.TestCase; import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.stat.DruidDataSourceStatManager; import com.alibaba.druid.stat.JdbcStatManager; public class TestStat extends TestCase { @@ -42,6 +43,7 @@ public class TestStat extends TestCase { stmt.close(); JdbcStatManager.getInstance().getDataSourceList(); + DruidDataSourceStatManager.getInstance().getDataSourceList(); } }