Author: kfujino Date: Mon Jun 22 07:29:05 2015 New Revision: 1686781 URL: http://svn.apache.org/r1686781 Log: Refactoring of the removeOldest method in SlowQueryReport to behave as expected.
Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java?rev=1686781&r1=1686780&r2=1686781&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java (original) +++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java Mon Jun 22 07:29:05 2015 @@ -17,6 +17,9 @@ package org.apache.tomcat.jdbc.pool.interceptor; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.Locale; import java.util.Map; @@ -68,6 +71,11 @@ public class SlowQueryReport extends Abs protected boolean logFailed = true; /** + * Sort QueryStats by last invocation time + */ + protected final Comparator<QueryStats> queryStatsComparator = new QueryStatsComparator(); + + /** * Returns the query stats for a given pool * @param poolname - the name of the pool we want to retrieve stats for * @return a hash map containing statistics for 0 to maxQueries @@ -186,15 +194,18 @@ public class SlowQueryReport extends Abs } /** - * TODO - implement a better algorithm + * Sort QueryStats by last invocation time * @param queries */ protected void removeOldest(ConcurrentHashMap<String,QueryStats> queries) { - Iterator<String> it = queries.keySet().iterator(); - while (queries.size()>maxQueries && it.hasNext()) { - String sql = it.next(); - it.remove(); + ArrayList<QueryStats> list = new ArrayList<>(queries.values()); + Collections.sort(list, queryStatsComparator); + int removeIndex = 0; + while (queries.size() > maxQueries) { + String sql = list.get(removeIndex).getQuery(); + queries.remove(sql); if (log.isDebugEnabled()) log.debug("Removing slow query, capacity reached:"+sql); + removeIndex++; } } @@ -444,5 +455,19 @@ public class SlowQueryReport extends Abs } } + private static class QueryStatsComparator implements Comparator<QueryStats> { + + @Override + public int compare(QueryStats stats1, QueryStats stats2) { + long result = stats1.lastInvocation - stats2.lastInvocation; + if (result > 0) { + return 1; + } else if (result == 0) { + return 0; + } else { + return -1; + } + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org