diff --git a/src/nl/astraeus/jdbc/JdbcLogger.java b/src/nl/astraeus/jdbc/JdbcLogger.java index 39657c8..356c769 100644 --- a/src/nl/astraeus/jdbc/JdbcLogger.java +++ b/src/nl/astraeus/jdbc/JdbcLogger.java @@ -1,5 +1,6 @@ package nl.astraeus.jdbc; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -163,13 +164,16 @@ } } + private final List queries; + private final List last100; private long startTime; private int port; public JdbcLogger(int port) { this.port = port; queries = new LinkedList(); + last100 = new LinkedList(); startTime = System.currentTimeMillis(); } @@ -193,11 +197,15 @@ synchronized (queries) { queries.add(entry); + last100.add(entry); while (queries.size() > logger.getSettings().getNumberOfQueries()) { entry = queries.remove(0); startTime = entry.getMilli(); } + while (last100.size() > 100) { + last100.remove(0); + } } } @@ -206,4 +214,10 @@ return new LinkedList(queries); } } + + public List getLast100() { + synchronized (queries) { + return new LinkedList(last100); + } + } } diff --git a/src/nl/astraeus/jdbc/JdbcLogger.java b/src/nl/astraeus/jdbc/JdbcLogger.java index 39657c8..356c769 100644 --- a/src/nl/astraeus/jdbc/JdbcLogger.java +++ b/src/nl/astraeus/jdbc/JdbcLogger.java @@ -1,5 +1,6 @@ package nl.astraeus.jdbc; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -163,13 +164,16 @@ } } + private final List queries; + private final List last100; private long startTime; private int port; public JdbcLogger(int port) { this.port = port; queries = new LinkedList(); + last100 = new LinkedList(); startTime = System.currentTimeMillis(); } @@ -193,11 +197,15 @@ synchronized (queries) { queries.add(entry); + last100.add(entry); while (queries.size() > logger.getSettings().getNumberOfQueries()) { entry = queries.remove(0); startTime = entry.getMilli(); } + while (last100.size() > 100) { + last100.remove(0); + } } } @@ -206,4 +214,10 @@ return new LinkedList(queries); } } + + public List getLast100() { + synchronized (queries) { + return new LinkedList(last100); + } + } } diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.html b/src/nl/astraeus/jdbc/web/page/QueryOverview.html index e180e56..1d992e1 100644 --- a/src/nl/astraeus/jdbc/web/page/QueryOverview.html +++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.html @@ -19,15 +19,21 @@
  • Total time
  • Avg. time
  • # Calls
  • +
  • Last 100
  • + ${if(sortLast100)} + + + ${else} + ${/if} @@ -35,9 +41,14 @@ ${each(queries as q)} + ${if(sortLast100)} + + + ${else} + ${/if} ${/each} diff --git a/src/nl/astraeus/jdbc/JdbcLogger.java b/src/nl/astraeus/jdbc/JdbcLogger.java index 39657c8..356c769 100644 --- a/src/nl/astraeus/jdbc/JdbcLogger.java +++ b/src/nl/astraeus/jdbc/JdbcLogger.java @@ -1,5 +1,6 @@ package nl.astraeus.jdbc; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -163,13 +164,16 @@ } } + private final List queries; + private final List last100; private long startTime; private int port; public JdbcLogger(int port) { this.port = port; queries = new LinkedList(); + last100 = new LinkedList(); startTime = System.currentTimeMillis(); } @@ -193,11 +197,15 @@ synchronized (queries) { queries.add(entry); + last100.add(entry); while (queries.size() > logger.getSettings().getNumberOfQueries()) { entry = queries.remove(0); startTime = entry.getMilli(); } + while (last100.size() > 100) { + last100.remove(0); + } } } @@ -206,4 +214,10 @@ return new LinkedList(queries); } } + + public List getLast100() { + synchronized (queries) { + return new LinkedList(last100); + } + } } diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.html b/src/nl/astraeus/jdbc/web/page/QueryOverview.html index e180e56..1d992e1 100644 --- a/src/nl/astraeus/jdbc/web/page/QueryOverview.html +++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.html @@ -19,15 +19,21 @@
  • Total time
  • Avg. time
  • # Calls
  • +
  • Last 100
  • TimestampDuration (ms)Total time (ms) Avg. time (ms) # CallsSql
    ${q.formattedTimestamp}${q.formattedNano}${q.total} ${q.formattedNano} ${q.count}
    ${!q.sql}
    + ${if(sortLast100)} + + + ${else} + ${/if} @@ -35,9 +41,14 @@ ${each(queries as q)} + ${if(sortLast100)} + + + ${else} + ${/if} ${/each} diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.java b/src/nl/astraeus/jdbc/web/page/QueryOverview.java index 36ac30d..bd74604 100644 --- a/src/nl/astraeus/jdbc/web/page/QueryOverview.java +++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.java @@ -25,23 +25,26 @@ public class QueryOverview extends StatsPage { private static Logger logger = LoggerFactory.getLogger(QueryOverview.class); - boolean sortTotalCalls = true; - boolean sortAvgTime = false; - boolean sortTotalTime = false; + public static enum Selected { + TOTAL_TIME, + AVERAGE, + CALLS, + LAST100 + } + + Selected selected = Selected.AVERAGE; public QueryOverview() {} public QueryOverview(String sorting) { - sortTotalCalls = false; - sortAvgTime = false; - sortTotalTime = false; - if ("total".equals(sorting)) { - sortTotalTime = true; + selected = Selected.TOTAL_TIME; } else if ("average".equals(sorting)) { - sortAvgTime = true; + selected = Selected.AVERAGE; } else if ("calls".equals(sorting)) { - sortTotalCalls = true; + selected = Selected.CALLS; + } else { + selected = Selected.LAST100; } } @@ -60,80 +63,94 @@ } public void set() { - List entries = JdbcLogger.get(getServerInfo().port).getEntries(); + List list; long fromTime = System.currentTimeMillis(); long toTime = System.currentTimeMillis(); long avgTime = 0; - Map condensed = new HashMap(); - List list; + if (selected == Selected.LAST100) { + list = JdbcLogger.get(getServerInfo().port).getLast100(); - if (!entries.isEmpty()) { - fromTime = entries.get(0).getTimestamp(); - toTime = entries.get(entries.size()-1).getTimestamp(); - - long total = 0; - - for (JdbcLogger.LogEntry le : entries) { - total += le.getNano(); - - JdbcLogger.LogEntry entry = condensed.get(le.getHash()); - - if (entry == null) { - entry = new JdbcLogger.LogEntry(le); - condensed.put(entry.getHash(), entry); - } else { - entry.addCount(le); - } + if (!list.isEmpty()) { + fromTime = list.get(0).getMilli(); + toTime = list.get(list.size()-1).getMilli(); + avgTime = ((toTime - fromTime) / list.size()) * 1000000L; } - avgTime = total / entries.size(); - } + set("count", list.size()); + } else { + List entries = JdbcLogger.get(getServerInfo().port).getEntries(); - list = new LinkedList(condensed.values()); + Map condensed = new HashMap(); - if (sortTotalCalls) { - Collections.sort(list, new Comparator() { - public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) { - return o2.getCount() - o1.getCount(); - } - }); - } else if (sortAvgTime) { - Collections.sort(list, new Comparator() { - public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) { - long n1 = o1.getNano() / o1.getCount(); - long n2 = o2.getNano() / o2.getCount(); + if (!entries.isEmpty()) { + fromTime = entries.get(0).getTimestamp(); + toTime = entries.get(entries.size() - 1).getTimestamp(); - if (n2 > n1) { - return 1; - } else if (n2 < n1) { - return -1; + long total = 0; + + for (JdbcLogger.LogEntry le : entries) { + total += le.getNano(); + + JdbcLogger.LogEntry entry = condensed.get(le.getHash()); + + if (entry == null) { + entry = new JdbcLogger.LogEntry(le); + condensed.put(entry.getHash(), entry); } else { - return 0; + entry.addCount(le); } } - }); - } else if (sortTotalTime) { - Collections.sort(list, new Comparator() { - public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) { - if (o2.getNano() > o1.getNano()) { - return 1; - } else if (o2.getNano() < o1.getNano()) { - return -1; - } else { - return 0; + + avgTime = total / entries.size(); + } + + list = new LinkedList(condensed.values()); + + if (selected == Selected.CALLS) { + Collections.sort(list, new Comparator() { + public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) { + return o2.getCount() - o1.getCount(); } - } - }); + }); + } else if (selected == Selected.AVERAGE) { + Collections.sort(list, new Comparator() { + public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) { + long n1 = o1.getNano() / o1.getCount(); + long n2 = o2.getNano() / o2.getCount(); + + if (n2 > n1) { + return 1; + } else if (n2 < n1) { + return -1; + } else { + return 0; + } + } + }); + } else if (selected == Selected.TOTAL_TIME) { + Collections.sort(list, new Comparator() { + public int compare(JdbcLogger.LogEntry o1, JdbcLogger.LogEntry o2) { + if (o2.getNano() > o1.getNano()) { + return 1; + } else if (o2.getNano() < o1.getNano()) { + return -1; + } else { + return 0; + } + } + }); + } + set("count", entries.size()); } set("queries", list); - set("count", entries.size()); - set("sortTotalCalls", sortTotalCalls); - set("sortAvgTime", sortAvgTime); - set("sortTotalTime", sortTotalTime); + set("sortTotalCalls", selected == Selected.CALLS); + set("sortAvgTime", selected == Selected.AVERAGE); + set("sortTotalTime", selected == Selected.TOTAL_TIME); + set("sortLast100", selected == Selected.LAST100); DateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss.SSS");
    TimestampDuration (ms)Total time (ms) Avg. time (ms) # CallsSql
    ${q.formattedTimestamp}${q.formattedNano}${q.total} ${q.formattedNano} ${q.count}
    ${!q.sql}