diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index b28ca7d3bd..90391cf09e 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -126,6 +126,20 @@ public class DruidStatManagerFacade { 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; diff --git a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java index a8dffa6b9c..d5797d596e 100644 --- a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java +++ b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java @@ -1,19 +1,18 @@ package com.alibaba.druid.support; -import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.DruidStatManagerFacade; -import com.alibaba.druid.stat.JdbcSqlStat; import com.alibaba.druid.util.MapComparator; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; /** + * 注意:避免直接调用Druid相关对象例如DruidDataSource等,相关调用要到DruidStatManagerFacade里用反射实现 + * * @author sandzhang */ public class JSONDruidStatService { @@ -96,16 +95,7 @@ public class JSONDruidStatService { if (page == null) page = DEFAULT_PAGE; if (perPageCount == null) perPageCount = DEFAULT_PER_PAGE_COUNT; - List> array = new ArrayList>(); - for (DruidDataSource datasource : druidStatManager.getDruidDataSourceInstances()) { - for (JdbcSqlStat sqlStat : datasource.getDataSourceStat().getSqlStatMap().values()) { - if (sqlStat.getExecuteCount() == 0 && sqlStat.getRunningCount() == 0) { - continue; - } - - array.add(druidStatManager.getSqlStatData(sqlStat)); - } - } + List> array = druidStatManager.getSqlStatDataList(); // orderby if (orderBy != null && orderBy.trim().length() != 0) { 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 009a0e373d..6fafeaf50f 100644 --- a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java +++ b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java @@ -2,23 +2,24 @@ package com.alibaba.druid.support.http; import java.io.IOException; import java.util.List; +import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -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.DruidStatManagerFacade; -import com.alibaba.druid.stat.JdbcSqlStat; import com.alibaba.druid.support.JSONDruidStatService; import com.alibaba.druid.util.IOUtils; import com.alibaba.druid.util.StringUtils; /** + * 注意:避免直接调用Druid相关对象例如DruidDataSource等,相关调用要到DruidStatManagerFacade里用反射实现 + * * @author sandzhang */ public class StatViewServlet extends HttpServlet { @@ -73,22 +74,19 @@ public class StatViewServlet extends HttpServlet { if (path.startsWith("/connectionInfo-") && path.endsWith(".html")) { Integer id = StringUtils.subStringToInteger(path, "connectionInfo-", "."); - DruidDataSource datasource = druidStatManager.getDruidDataSourceById(id); - returnViewConnectionInfo(datasource, request, response); + returnViewConnectionInfo(id, request, response); return; } if (path.startsWith("/activeConnectionStackTrace-") && path.endsWith(".html")) { Integer id = StringUtils.subStringToInteger(path, "activeConnectionStackTrace-", "."); - DruidDataSource datasource = druidStatManager.getDruidDataSourceById(id); - returnViewActiveConnectionStackTrace(datasource, request, response); + returnViewActiveConnectionStackTrace(id, request, response); return; } if (path.startsWith("/sql-") && path.endsWith(".html")) { Integer id = StringUtils.subStringToInteger(path, "sql-", "."); - JdbcSqlStat sqlStat = druidStatManager.getSqlStatById(id); - returnViewSqlStat(sqlStat, response); + returnViewSqlStat(druidStatManager.getSqlStatData(id), response); return; } @@ -96,48 +94,41 @@ public class StatViewServlet extends HttpServlet { returnResourceFile(path, response); } - private void returnViewActiveConnectionStackTrace(DruidDataSource datasource, HttpServletRequest request, + private void returnViewActiveConnectionStackTrace(Integer id, HttpServletRequest request, HttpServletResponse response) throws IOException { - if (datasource == null) return; - - if (!datasource.isRemoveAbandoned()) { - response.getWriter().print(mergeTemplatePage("ERROR", "require set removeAbandoned=true")); - return; - } String text = IOUtils.readFromResource(RESOURCE_PATH + "/activeConnectionStackTrace.html"); - text = text.replaceAll("\\{datasourceId\\}", String.valueOf(System.identityHashCode(datasource))); + text = text.replaceAll("\\{datasourceId\\}", id.toString()); response.getWriter().print(text); } - private void returnViewConnectionInfo(DruidDataSource datasource, HttpServletRequest request, - HttpServletResponse response) throws IOException { - if (datasource == null) return; - + private void returnViewConnectionInfo(Integer id, HttpServletRequest request, HttpServletResponse response) + throws IOException { String text = IOUtils.readFromResource(RESOURCE_PATH + "/connectionInfo.html"); - text = text.replaceAll("\\{datasourceId\\}", String.valueOf(System.identityHashCode(datasource))); + text = text.replaceAll("\\{datasourceId\\}", id.toString()); response.getWriter().print(text); } - private void returnViewSqlStat(JdbcSqlStat sqlStat, HttpServletResponse response) throws IOException { + private void returnViewSqlStat(Map sqlStat, HttpServletResponse response) throws IOException { if (sqlStat == null) return; StringBuilder content = new StringBuilder(); - content.append("

FULL SQL

" + sqlStat.getSql() + "

"); + content.append("

FULL SQL

" + sqlStat.get("SQL") + "

"); content.append("

Format View:

"); content.append("
"); content.append("

API:com.alibaba.druid.sql.SQLUtils.format(sql,DBType);

"); content.append("
"); - List statementList = SQLUtils.parseStatements(sqlStat.getSql(), sqlStat.getDbType()); + List statementList = SQLUtils.parseStatements((String) sqlStat.get("SQL"), + (String) sqlStat.get("DbType")); if (!statementList.isEmpty()) { content.append("

Parse View:

"); SQLStatement statemen = statementList.get(0); - SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(statementList, sqlStat.getDbType()); + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(statementList, (String) sqlStat.get("DbType")); statemen.accept(visitor); content.append(""); content.append(""); diff --git a/src/main/java/com/alibaba/druid/util/ReflectionUtils.java b/src/main/java/com/alibaba/druid/util/ReflectionUtils.java index 49f979a65a..098dbe0c21 100644 --- a/src/main/java/com/alibaba/druid/util/ReflectionUtils.java +++ b/src/main/java/com/alibaba/druid/util/ReflectionUtils.java @@ -33,13 +33,23 @@ public class ReflectionUtils { return null; } } + public static Object callPublicMethod(Object obj, String methodName) { + + try { + Method m = obj.getClass().getMethod(methodName); + return m.invoke(obj); + } catch (Exception e) { + return null; + } + } - public static String getTest() { - return "test"; + public void getTest() { + System.out.println("dd"); +// return "test"; } public static void main(String args[]) { - System.out.println(callStaticMethod(ReflectionUtils.class, "getTest")); +// System.out.println(callStaticMethod(new ReflectionUtils(), "getTest")); } }