From 95f7ab01c85a1867f864192c52b088b23d080091 Mon Sep 17 00:00:00 2001 From: septer Date: Sun, 12 Aug 2012 12:05:36 +0800 Subject: [PATCH] wenshao committed. --- .../DruidStatManagerFacade.java.BASE.java | 75 ++++++++ .../DruidStatManagerFacade.java.LOCAL.java | 75 ++++++++ .../DruidStatManagerFacade.java.REMOTE.java | 168 ++++++++++++++++++ 3 files changed, 318 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.BASE.java create mode 100644 src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.LOCAL.java create mode 100644 src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.REMOTE.java diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.BASE.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.BASE.java new file mode 100644 index 0000000000..efa89be2a2 --- /dev/null +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.BASE.java @@ -0,0 +1,75 @@ +package com.alibaba.druid.stat; + +import java.util.List; +import java.util.Map; + +/** + * 监控相关的对外数据暴露 + * + *
+ * 1. 为了支持jndi数据源本类内部调用druid相关对象均需要反射调用,返回值也应该是Object,List,Map等无关于druid的类型
+ * 2. 对外暴露的public方法都应该先调用init(),应该有更好的方式,暂时没想到
+ * 
+ * 
+ * @author sandzhang
+ */
+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 DruidStatManagerFacade(){
+    }
+
+    public static DruidStatManagerFacade getInstance() {
+        return instance;
+    }
+
+    public Map getSqlStatData(Integer id) {
+        return ctx.getSqlStatData(id);
+    }
+
+    public List> getSqlStatDataList() {
+        return ctx.getSqlStatDataList();
+    }
+
+    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 resetAll() {
+        ctx.resetAll();
+    }
+
+    public Object getDruidDataSourceById(Integer id) {
+        return ctx.getDruidDataSourceById(id);
+    }
+
+    public Object getSqlStatById(Integer id) {
+        return ctx.getSqlStatById(id);
+    }
+}
diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.LOCAL.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.LOCAL.java
new file mode 100644
index 0000000000..864e6d8a09
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.LOCAL.java
@@ -0,0 +1,75 @@
+package com.alibaba.druid.stat;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 监控相关的对外数据暴露
+ * 
+ * 
+ * 1. 为了支持jndi数据源本类内部调用druid相关对象均需要反射调用,返回值也应该是Object,List,Map等无关于druid的类型
+ * 2. 对外暴露的public方法都应该先调用init(),应该有更好的方式,暂时没想到
+ * 
+ * 
+ * @author sandzhang
+ */
+public class DruidStatManagerFacade {
+
+    private final static DruidStatManagerFacade       instance = new DruidStatManagerFacade();
+
+    private static DruidDataSourceStatStrategyContext ctx      = null;
+
+    private static DruidDataSourceStatStrategy        strategy = null;
+
+    static {
+        strategy = new DruidDataSourceStatReflectStatStrategy();
+        ctx = new DruidDataSourceStatStrategyContext(strategy);
+    }
+
+    private DruidStatManagerFacade(){
+    }
+
+    public static DruidStatManagerFacade getInstance() {
+        return instance;
+    }
+
+    public Map getSqlStatData(Integer id) {
+        return ctx.getSqlStatData(id);
+    }
+
+    public List> getSqlStatDataList() {
+        return ctx.getSqlStatDataList();
+    }
+
+    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 resetAll() {
+        ctx.resetAll();
+    }
+
+    public Object getDruidDataSourceById(Integer id) {
+        return ctx.getDruidDataSourceById(id);
+    }
+
+    public Object getSqlStatById(Integer id) {
+        return ctx.getSqlStatById(id);
+    }
+}
diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.REMOTE.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.REMOTE.java
new file mode 100644
index 0000000000..c84ba7d3d7
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java.REMOTE.java
@@ -0,0 +1,168 @@
+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;
+
+/**
+ * 监控相关的对外数据暴露
+ * 
+ * 
+ * 1. 为了支持jndi数据源本类内部调用druid相关对象均需要反射调用,返回值也应该是Object,List,Map等无关于druid的类型
+ * 2. 对外暴露的public方法都应该先调用init(),应该有更好的方式,暂时没想到
+ * 
+ * 
+ * @author sandzhang
+ */
+public class DruidStatManagerFacade {
+
+    private final static DruidStatManagerFacade instance = new DruidStatManagerFacade();
+
+    private DruidStatManagerFacade(){
+    }
+
+    public static DruidStatManagerFacade getInstance() {
+        return instance;
+    }
+
+    private Set getDruidDataSourceInstances() {
+        return DruidDataSourceStatManager.getInstances().keySet();
+    }
+
+    public void resetDataSourceStat() {
+        DruidDataSourceStatManager.getInstance().reset();
+    }
+
+    public void resetSqlStat() {
+        JdbcStatManager.getInstance().reset();
+    }
+
+    public void resetAll() {
+        resetSqlStat();
+        resetDataSourceStat();
+    }
+
+    public Object getSqlStatById(Integer 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);
+    }
+}