From 82370048b37a8dd00db7a64b8503098aa7844258 Mon Sep 17 00:00:00 2001 From: sand Date: Mon, 6 Aug 2012 22:13:19 +0800 Subject: [PATCH] DruidStat: support jndi datasource --- .../druid/stat/DruidStatManagerFacade.java | 86 +++++++++++++++++++ .../druid/support/http/StatViewServlet.java | 18 ++-- .../alibaba/druid/util/ReflectionUtils.java | 45 ++++++++++ 3 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java create mode 100644 src/main/java/com/alibaba/druid/util/ReflectionUtils.java diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java new file mode 100644 index 0000000000..beaea6bf9c --- /dev/null +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -0,0 +1,86 @@ +package com.alibaba.druid.stat; + +import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.ReflectionUtils; + +/** + * @author sandzhang + */ +public class DruidStatManagerFacade { + + private final static DruidStatManagerFacade instance = new DruidStatManagerFacade(); + + private boolean inited = false; + + protected final ReentrantLock lock = new ReentrantLock(true); + + private DruidDataSourceStatManager druidDataSourceStatManager; + private JdbcStatManager jdbcStatManager; + + private Set datasourceInstances; + + private DruidStatManagerFacade() { + } + + public static DruidStatManagerFacade getInstance() { + return instance; + } + + private void init() { + if (inited) { + return; + } + + lock.lock(); + if (inited) { + return; + } + + try { + initByClassLoader(); + + inited = true; + } finally { + lock.unlock(); + } + } + + @SuppressWarnings("unchecked") + private void initByClassLoader() { + Class druidDataSourceStatManagerClass = ReflectionUtils.getClassFromWebContainerOrCurrentClassLoader("com.alibaba.druid.stat.DruidDataSourceStatManager"); + + druidDataSourceStatManager = (DruidDataSourceStatManager) ReflectionUtils.callStaticMethod(druidDataSourceStatManagerClass, + "getInstance"); + datasourceInstances = (Set) ReflectionUtils.callStaticMethod(druidDataSourceStatManagerClass, + "getDruidDataSourceInstances"); + + Class jdbcStatManagerClass = ReflectionUtils.getClassFromWebContainerOrCurrentClassLoader("com.alibaba.druid.stat.JdbcStatManager"); + jdbcStatManager = (JdbcStatManager) ReflectionUtils.callStaticMethod(jdbcStatManagerClass, "getInstance"); + + } + + public Set getDruidDataSourceInstances() { + init(); + return datasourceInstances; + } + + public void resetDataSourceStat() { + init(); + druidDataSourceStatManager.reset(); + } + + public void resetSqlStat() { + init(); + jdbcStatManager.reset(); + } + + public void resetAll() { + init(); + resetSqlStat(); + resetDataSourceStat(); + + } +} diff --git a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java index 11db348cd0..e0291e9998 100644 --- a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java +++ b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java @@ -22,9 +22,8 @@ import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; -import com.alibaba.druid.stat.DruidDataSourceStatManager; +import com.alibaba.druid.stat.DruidStatManagerFacade; import com.alibaba.druid.stat.JdbcSqlStat; -import com.alibaba.druid.stat.JdbcStatManager; import com.alibaba.druid.util.IOUtils; import com.alibaba.druid.util.MapComparator; import com.alibaba.druid.util.StringUtils; @@ -50,6 +49,8 @@ public class StatViewServlet extends HttpServlet { private final static String TEMPLATE_PAGE_RESOURCE_PATH = RESOURCE_PATH + "/template.html"; private static final String DEFAULT_ORDER_TYPE = "asc"; + + private static DruidStatManagerFacade druidStatManager=DruidStatManagerFacade.getInstance(); public String templatePage; @@ -251,8 +252,7 @@ public class StatViewServlet extends HttpServlet { } private void resetAllStat() { - JdbcStatManager.getInstance().reset(); - DruidDataSourceStatManager.getInstance().reset(); + druidStatManager.resetAll(); } private List getDriversData() { @@ -275,7 +275,7 @@ public class StatViewServlet extends HttpServlet { private List getDataSourceStatList() { List datasourceList = new ArrayList(); - for (DruidDataSource dataSource : DruidDataSourceStatManager.getDruidDataSourceInstances()) { + for (DruidDataSource dataSource : druidStatManager.getDruidDataSourceInstances()) { datasourceList.add(dataSourceToMapData(dataSource)); } return datasourceList; @@ -298,7 +298,7 @@ public class StatViewServlet extends HttpServlet { } private JdbcSqlStat getSqlStatById(Integer id) { - for (DruidDataSource ds : DruidDataSourceStatManager.getDruidDataSourceInstances()) { + for (DruidDataSource ds : druidStatManager.getDruidDataSourceInstances()) { JdbcSqlStat sqlStat = ds.getDataSourceStat().getSqlStat(id); if (sqlStat != null) return sqlStat; } @@ -309,7 +309,7 @@ public class StatViewServlet extends HttpServlet { if (identity == null) { return null; } - for (DruidDataSource datasource : DruidDataSourceStatManager.getDruidDataSourceInstances()) { + for (DruidDataSource datasource : druidStatManager.getDruidDataSourceInstances()) { if (System.identityHashCode(datasource) == identity) { return datasource; } @@ -337,12 +337,12 @@ public class StatViewServlet extends HttpServlet { if (perPageCount == null) perPageCount = DEFAULT_PER_PAGE_COUNT; List> array = new ArrayList>(); - for (DruidDataSource datasource : DruidDataSourceStatManager.getDruidDataSourceInstances()) { + for (DruidDataSource datasource : druidStatManager.getDruidDataSourceInstances()) { for (JdbcSqlStat sqlStat : datasource.getDataSourceStat().getSqlStatMap().values()) { if (sqlStat.getExecuteCount() == 0 && sqlStat.getRunningCount() == 0) { continue; } - + array.add(getSqlStatData(sqlStat)); } } diff --git a/src/main/java/com/alibaba/druid/util/ReflectionUtils.java b/src/main/java/com/alibaba/druid/util/ReflectionUtils.java new file mode 100644 index 0000000000..49f979a65a --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/ReflectionUtils.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.util; + +import java.lang.reflect.Method; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author sandzhang + */ +public class ReflectionUtils { + + public static Class getClassFromWebContainerOrCurrentClassLoader(String className) { + Class result = null; + try { + result = HttpServletRequest.class.getClassLoader().loadClass(className); + } catch (ClassNotFoundException e) { + } + if (result == null) { + try { + result = Thread.currentThread().getContextClassLoader().loadClass(className); + } catch (ClassNotFoundException e) { + } + } + return result; + } + + public static Object callStaticMethod(Class classObject, String methodName) { + + try { + Method m = classObject.getMethod(methodName); + return m.invoke(classObject); + } catch (Exception e) { + return null; + } + } + + public static String getTest() { + return "test"; + } + + public static void main(String args[]) { + System.out.println(callStaticMethod(ReflectionUtils.class, "getTest")); + + } +}