Author: kfujino Date: Mon Jun 22 07:59:54 2015 New Revision: 1686791 URL: http://svn.apache.org/r1686791 Log: Refactoring of the removeOldest method in SlowQueryReport to behave as expected.
Modified: tomcat/tc8.0.x/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc8.0.x/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java?rev=1686791&r1=1686790&r2=1686791&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java (original) +++ tomcat/tc8.0.x/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java Mon Jun 22 07:59:54 2015 @@ -17,7 +17,9 @@ package org.apache.tomcat.jdbc.pool.interceptor; import java.text.SimpleDateFormat; -import java.util.Iterator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Locale; import java.util.Map; import java.util.TimeZone; @@ -68,6 +70,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 @@ -104,6 +111,16 @@ public class SlowQueryReport extends Abs } @Override + protected String reportQuery(String query, Object[] args, final String name, long start, long delta) { + String sql = super.reportQuery(query, args, name, start, delta); + if (this.maxQueries > 0 ) { + QueryStats qs = this.getQueryStats(sql); + qs.add(delta, start); + } + return sql; + } + + @Override protected String reportSlowQuery(String query, Object[] args, String name, long start, long delta) { String sql = super.reportSlowQuery(query, args, name, start, delta); if (this.maxQueries > 0 ) { @@ -186,15 +203,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 +464,22 @@ public class SlowQueryReport extends Abs } } + private static class QueryStatsComparator implements Comparator<QueryStats> { + + @Override + public int compare(QueryStats stats1, QueryStats stats2) { + if (stats1.lastInvocation == 0) return 1; + if (stats2.lastInvocation == 0) return -1; + + long result = stats1.lastInvocation - stats2.lastInvocation; + if (result > 0) { + return 1; + } else if (result == 0) { + return 0; + } else { + return -1; + } + } + } } Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1686791&r1=1686790&r2=1686791&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Mon Jun 22 07:59:54 2015 @@ -179,6 +179,14 @@ </fix> </changelog> </subsection> + <subsection name="jdbc-pool"> + <changelog> + <fix> + Refactoring of the <code>removeOldest</code> method in + <code>SlowQueryReport</code> to behave as expected. (kfujino) + </fix> + </changelog> + </subsection> <subsection name="Other"> <changelog> <update> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org