From 643c34d9c79a959820b8a4a3736c31e3b4714bb0 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 3 Oct 2017 13:12:57 +0800 Subject: [PATCH] improved get statdata performance. --- .../alibaba/druid/stat/JdbcSqlStatValue.java | 2 +- .../com/alibaba/druid/util/MapComparator.java | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java b/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java index 56927b3e3d..4ec7283178 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcSqlStatValue.java @@ -628,7 +628,7 @@ public class JdbcSqlStatValue { } public Map getData() throws JMException { - Map map = new HashMap(); + Map map = new HashMap(48); // 0 - 4 map.put("ID", id); diff --git a/src/main/java/com/alibaba/druid/util/MapComparator.java b/src/main/java/com/alibaba/druid/util/MapComparator.java index a2dc43077e..502ac6a6ea 100644 --- a/src/main/java/com/alibaba/druid/util/MapComparator.java +++ b/src/main/java/com/alibaba/druid/util/MapComparator.java @@ -61,13 +61,20 @@ public class MapComparator implements Compar if (key instanceof String) { String keyStr = (String) key; - if (keyStr.matches(".+\\[[0-9]+\\]")) { - Object value = map.get(keyStr.substring(0, keyStr.indexOf('['))); + int bracketIndex = keyStr.indexOf('['); + if (bracketIndex > 0) { + Object value = map.get(keyStr.substring(0, bracketIndex)); if (value == null) { return null; } - Integer index = StringUtils.subStringToInteger(keyStr, "[", "]"); + int p2 = keyStr.indexOf(']', bracketIndex); + if (p2 == -1) { + return null; + } + + String indexText = keyStr.substring(bracketIndex + 1, p2); + int index = Integer.parseInt(indexText); if (value.getClass().isArray() && Array.getLength(value) >= index) { return Array.get(value, index); } @@ -92,6 +99,10 @@ public class MapComparator implements Compar return 1; } + if (v1 instanceof Long) { + return (int) (((Long) v1).longValue() - ((Number) v2).longValue()); + } + if (v1 instanceof Number) { return compare((Number) v1, (Number) v2); }