From 5b2de72f6cd3cd06845cd2ccd4e762cd8c320f54 Mon Sep 17 00:00:00 2001 From: "shrek.wang" Date: Thu, 30 Aug 2012 10:52:22 +0800 Subject: [PATCH 1/3] fixes nullpoint problem if no sqlstat data when execute cmd tool --- .../druid/stat/DruidStatManagerFacade.java | 4 +++- .../druid/support/console/DruidStat.java | 12 ++++++++++-- .../alibaba/druid/support/console/Option.java | 18 +++++++++++++++++- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index 1891eb4092..7c9cfb9bfe 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -183,7 +183,9 @@ public final class DruidStatManagerFacade { List> traceList = new ArrayList>(); for (Object dataSource : getDruidDataSourceInstances()) { List stacks = ((DruidDataSource) dataSource).getActiveConnectionStackTrace(); - traceList.add(stacks); + if (stacks.size() > 0 ) { + traceList.add(stacks); + } } return traceList; } diff --git a/src/main/java/com/alibaba/druid/support/console/DruidStat.java b/src/main/java/com/alibaba/druid/support/console/DruidStat.java index 6f922e1835..aca6aa9ccb 100644 --- a/src/main/java/com/alibaba/druid/support/console/DruidStat.java +++ b/src/main/java/com/alibaba/druid/support/console/DruidStat.java @@ -74,12 +74,20 @@ public class DruidStat { if (option.printSqlData()) { List> content = (List>) invokeService(jmxConn, Option.SQL); - TabledDataPrinter.printSqlData(content, option); + if (content == null ) { + System.out.println("无SqlStat统计数据,请检查是否已执行了SQL"); + } else { + TabledDataPrinter.printSqlData(content, option); + } } if (option.printActiveConn()) { List> content = (List>) invokeService(jmxConn, Option.ACTIVE_CONN); - TabledDataPrinter.printActiveConnStack(content, option); + if (content == null || content.size() == 0 ) { + System.out.println("目前无活动中的数据库连接"); + } else { + TabledDataPrinter.printActiveConnStack(content, option); + } } } diff --git a/src/main/java/com/alibaba/druid/support/console/Option.java b/src/main/java/com/alibaba/druid/support/console/Option.java index efa4f5d3c4..b358f26792 100644 --- a/src/main/java/com/alibaba/druid/support/console/Option.java +++ b/src/main/java/com/alibaba/druid/support/console/Option.java @@ -155,10 +155,26 @@ public class Option { System.out.println(); System.out.println("说明: "); - System.out.println(" -sql,-ds,-act参数中要至少指定一种数据进行打印, 可以组合使用, 比如 -sql -ds 一起的话就打印两种统计数据"); + System.out.println(" -sql,-ds,-act参数中要至少指定一种数据进行打印, 可以"); + System.out.println(" 组合使用, 比如 -sql -ds 一起的话就打印两种统计数据"); System.out.println(" -id id可以跟 -sql 或-ds组合, 比如 -sql -id 5 或 -ds -id 1086752"); System.out.println(" pid必需指定, refresh-interval可选, 如不指定,则打印数据后退出"); System.out.println(" pid和refresh-interval参数必需放在命令行的最后, 否则解析会出错"); + + System.out.println(); + System.out.println("例子: "); + System.out.println(" 打印3983进程的sql 统计数据."); + System.out.println(" >druidStat -sql 3983"); + System.out.println(" 打印3983进程的ds统计数据."); + System.out.println(" >druidStat -ds 3983"); + System.out.println(" 打印3983进程的sql的id为10的详细统计数据."); + System.out.println(" >druidStat -sql -id 10 -detail 3983"); + System.out.println(" 打印3983进程的当前活动连接的堆栈信息"); + System.out.println(" >druidStat -act 3983"); + System.out.println(" 打印3983进程的ds,sql,和act信息"); + System.out.println(" >druidStat -ds -sql -act 3983"); + System.out.println(" 每隔5秒自动打印ds统计数据"); + System.out.println(" >druidStat -ds 3983 5"); } public int getId() { From 2b83a532e41c6d82b34f587d8a39660711a6691c Mon Sep 17 00:00:00 2001 From: "shrek.wang" Date: Thu, 30 Aug 2012 10:52:56 +0800 Subject: [PATCH 2/3] add DruidStatNullDataTest testcase --- .../bvt/console/DruidStatNullDataTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/console/DruidStatNullDataTest.java diff --git a/src/test/java/com/alibaba/druid/bvt/console/DruidStatNullDataTest.java b/src/test/java/com/alibaba/druid/bvt/console/DruidStatNullDataTest.java new file mode 100644 index 0000000000..2de5a69f8c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/console/DruidStatNullDataTest.java @@ -0,0 +1,61 @@ +package com.alibaba.druid.bvt.console; + +import org.junit.runner.notification.Failure; +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import com.alibaba.druid.support.console.DruidStat; +import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.console.Option; +import junit.framework.TestCase; +import java.lang.management.ManagementFactory; + +public class DruidStatNullDataTest extends TestCase { + + private DruidDataSource dataSource; + + private static String getSelfPid() { + String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; + return pid; + } + + protected void createDs() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setMinIdle(1); + dataSource.setUrl("jdbc:h2:mem:test;"); + dataSource.setTestOnBorrow(false); + dataSource.setFilters("stat"); + dataSource.setRemoveAbandoned(true); + dataSource.setRemoveAbandonedTimeout(600); + //do not execute any sql, just init the datasource. + dataSource.init(); + + } + + protected void dispose() throws Exception { + JdbcUtils.close(dataSource); + } + + public void test_printDruidStat() throws Exception { + createDs(); + String pid = getSelfPid(); + String[] cmdArray = {"-sql", pid}; + Option opt = Option.parseOptions(cmdArray); + DruidStat.printDruidStat(opt); + + cmdArray = new String[] {"-act", pid}; + opt = Option.parseOptions(cmdArray); + DruidStat.printDruidStat(opt); + dispose(); + } + + public static void main(String[] args) { + Result result = JUnitCore.runClasses(DruidStatNullDataTest.class); + for (Failure failure : result.getFailures()) { + System.out.println(failure.toString()); + } + } + + + +} From 7c043a044067d4a5826db7a75be585452e7b1645 Mon Sep 17 00:00:00 2001 From: "shrek.wang" Date: Thu, 30 Aug 2012 10:53:52 +0800 Subject: [PATCH 3/3] add -Dfile.encoding system property in command line arguments --- src/main/scripts/druidStat.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scripts/druidStat.sh b/src/main/scripts/druidStat.sh index 0bdb2dd8f5..f2d7113bf1 100644 --- a/src/main/scripts/druidStat.sh +++ b/src/main/scripts/druidStat.sh @@ -5,4 +5,4 @@ if [ -z "$JAVA_HOME" ] ; then exit 1 fi -"$JAVA_HOME/bin/java" -cp "./druid-0.2.6.jar:$JAVA_HOME/lib/tools.jar" com.alibaba.druid.support.console.DruidStat $@ +"$JAVA_HOME/bin/java" -Dfile.encoding="UTF-8" -cp "./druid-0.2.6.jar:$JAVA_HOME/lib/tools.jar" com.alibaba.druid.support.console.DruidStat $@