diff --git a/pom.xml b/pom.xml index 9cf18e9825..696465cc14 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.alibaba druid - 0.2.6-SNAPSHOT + 0.2.7-SNAPSHOT jar druid @@ -213,7 +213,7 @@ - + javax.servlet @@ -252,18 +252,18 @@ true - org.mybatis - mybatis - 3.1.1 - provided - true + org.mybatis + mybatis + 3.1.1 + provided + true - org.mybatis - mybatis-spring - 1.1.1 - provided - true + org.mybatis + mybatis-spring + 1.1.1 + provided + true @@ -316,11 +316,11 @@ 11.2.0.3 provided --> - com.oracle - ojdbc14 - 10.2.0.2 - provided + com.oracle + ojdbc14 + 10.2.0.2.0 + com.microsoft.sqlserver sqljdbc4 diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java index 769c4ceee6..d8026865f4 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatJNDIStatStrategy.java @@ -3,21 +3,12 @@ package com.alibaba.druid.stat; 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 Object getStrategyB() { - try { - Class clazz = ReflectionUtils.getClassFromWebContainerOrCurrentClassLoader("com.alibaba.druid.stat.DruidDataSourceStatDefaultStrategy"); - return clazz.newInstance(); - } catch (Exception e) { - LOG.error(e.getMessage(), e); - return null; - } + return ReflectionUtils.getClassFromWebContainerOrCurrentClassLoader("com.alibaba.druid.stat.DruidDataSourceStatDefaultStrategy"); } @SuppressWarnings("unchecked") 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 6fafeaf50f..addaba62f1 100644 --- a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java +++ b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java @@ -1,6 +1,8 @@ package com.alibaba.druid.support.http; import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.List; import java.util.Map; @@ -36,6 +38,7 @@ public class StatViewServlet extends HttpServlet { private static JSONDruidStatService jsonDruidStatService = JSONDruidStatService.getInstance(); public String templatePage; + private static DateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SSS"); public void init() throws ServletException { try { @@ -121,9 +124,26 @@ public class StatViewServlet extends HttpServlet { content.append("
"); content.append("

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

"); content.append("
"); - - List statementList = SQLUtils.parseStatements((String) sqlStat.get("SQL"), - (String) sqlStat.get("DbType")); + + if (sqlStat.get("LastSlowParameters") != null + && sqlStat.get("LastSlowParameters").toString().trim().length() > 0) { + content.append("

LastSlow SQL View:

"); + content.append(""); + content.append(""); + content.append(""); + content.append(""); + content.append(""); + content.append(""); + content.append(""); + content.append(""); + content.append(""); + content.append("
MaxTimespanOccurTime" + format.format(sqlStat.get("MaxTimespanOccurTime")) + "
LastSlowParameters" + sqlStat.get("LastSlowParameters") + "
"); + content.append("
"); + } + + List statementList = SQLUtils.parseStatements((String) sqlStat.get("SQL"), + (String) sqlStat.get("DbType")); + if (!statementList.isEmpty()) { content.append("

Parse View:

"); diff --git a/src/main/java/com/alibaba/druid/util/ReflectionUtils.java b/src/main/java/com/alibaba/druid/util/ReflectionUtils.java index 223a861cd6..045313c4ec 100644 --- a/src/main/java/com/alibaba/druid/util/ReflectionUtils.java +++ b/src/main/java/com/alibaba/druid/util/ReflectionUtils.java @@ -42,20 +42,10 @@ public class ReflectionUtils { } } - public static Object callObjectMethod(Object obj, String methodName) { + public static Object callObjectMethod(Object obj, String methodName, Object... methodParams) { 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 Object callObjectMethod(Object obj, String methodName, Integer id) { - try { - Method m = obj.getClass().getMethod(methodName, Integer.class); - return m.invoke(obj, id); + return m.invoke(obj, methodParams); } catch (Exception e) { LOG.warn("callObjectMethod fail:class=" + obj.getClass().getName() + " method=" + methodName, e); return null; diff --git a/src/main/resources/support/http/resources/js/sql.js b/src/main/resources/support/http/resources/js/sql.js index 02172ba557..ef769229b8 100644 --- a/src/main/resources/support/http/resources/js/sql.js +++ b/src/main/resources/support/http/resources/js/sql.js @@ -94,6 +94,7 @@ function ajaxResponseForDataSourceSqlStatInfo() { for ( var i = 0; i < sqlStatList.length; i++) { var sqlStat = sqlStatList[i]; var newRow = sqlStatTable.insertRow(-1); + newRow.insertCell(-1).innerHTML = i+1; newRow.insertCell(-1).innerHTML = '' + subSqlString(sqlStat.SQL, 25) + ''; // if (sqlStat.File) // newRow.insertCell(-1).innerHTML = sqlStat.File; @@ -105,7 +106,12 @@ function ajaxResponseForDataSourceSqlStatInfo() { // newRow.insertCell(-1).innerHTML = ''; newRow.insertCell(-1).innerHTML = sqlStat.ExecuteCount; newRow.insertCell(-1).innerHTML = sqlStat.TotalTime; - newRow.insertCell(-1).innerHTML = sqlStat.MaxTimespan; + //显示执行的时间比配置的均值时间慢的SQL链接 + var lastSlowHtml = sqlStat.MaxTimespan; + if(sqlStat.LastSlowParameters!=null&&sqlStat.LastSlowParameters.length>0){ + lastSlowHtml =''+sqlStat.MaxTimespan+''; + } + newRow.insertCell(-1).innerHTML = lastSlowHtml; newRow.insertCell(-1).innerHTML = sqlStat.InTransactionCount; newRow.insertCell(-1).innerHTML = sqlStat.ErrorCount; newRow.insertCell(-1).innerHTML = sqlStat.EffectedRowCount; @@ -120,8 +126,8 @@ function ajaxResponseForDataSourceSqlStatInfo() { // hiHtml += 'ExecAndRsHold'; newRow.insertCell(-1).innerHTML = '[' + sqlStat.Histogram + ']'; + newRow.insertCell(-1).innerHTML = '[' + sqlStat.ExecuteAndResultHoldTimeHistogram + ']'; newRow.insertCell(-1).innerHTML = '[' + sqlStat.FetchRowCountHistogram + ']'; newRow.insertCell(-1).innerHTML = '[' + sqlStat.EffectedRowCountHistogram + ']'; - newRow.insertCell(-1).innerHTML = '[' + sqlStat.ExecuteAndResultHoldTimeHistogram + ']'; } } \ No newline at end of file diff --git a/src/main/resources/support/http/resources/sql.html b/src/main/resources/support/http/resources/sql.html index a2515003be..480de266ce 100644 --- a/src/main/resources/support/http/resources/sql.html +++ b/src/main/resources/support/http/resources/sql.html @@ -24,6 +24,7 @@ + @@ -44,6 +45,16 @@ -- ] + - +
N-- SQL Execute Count Execute Millis Total ExecAndRsHold
[ + - + - + - + - + - + - + - + - ] +
FetchRow
[ - - @@ -60,16 +71,7 @@ - - ]
ExecAndRsHold
[ - - - - - - - - - - - - - - - - ] -