From: fhanik Date: Thu, 4 Dec 2008 07:07:23 +0000 (+0000) Subject: start working on the interceptor for query stats X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=1edf32a1f681b3e2f675da4575b0cca83c9f5785;p=tomcat7.0 start working on the interceptor for query stats git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@723228 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java index aa3efab1f..a10eb3a01 100644 --- a/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java +++ b/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java @@ -21,6 +21,10 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.CallableStatement; import java.sql.SQLException; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.LinkedHashMap; +import java.util.Map.Entry; import org.apache.tomcat.jdbc.pool.ConnectionPool; import org.apache.tomcat.jdbc.pool.JdbcInterceptor; @@ -30,78 +34,173 @@ import org.apache.tomcat.jdbc.pool.PooledConnection; * @author Filip Hanik * @version 1.0 */ -public class SlowQueryReport extends JdbcInterceptor { +public class SlowQueryReport extends AbstractCreateStatementInterceptor { protected final String[] statements = {"createStatement","prepareStatement","prepareCall"}; protected final String[] executes = {"execute","executeQuery","executeUpdate","executeBatch"}; + protected static IdentityHashMap> perPoolStats = + new IdentityHashMap>(); + + protected HashMap queries = null; + + protected long threshold = 100; //don't report queries less than this + protected int maxQueries= 1000; //don't store more than this amount of queries + + + public SlowQueryReport() { super(); } - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - boolean process = false; - process = process(statements, method, process); - if (process) { - Object statement = super.invoke(proxy,method,args); - CallableStatement measuredStatement = - (CallableStatement)Proxy.newProxyInstance(SlowQueryReport.class.getClassLoader(), - new Class[] {java.sql.CallableStatement.class, - java.sql.PreparedStatement.class, - java.sql.Statement.class}, - new StatementProxy(statement, args)); - - return measuredStatement; - } else { - return super.invoke(proxy,method,args); + public long getThreshold() { + return threshold; + } + + public void setThreshold(long threshold) { + this.threshold = threshold; + } + + @Override + public void closeInvoked() { + // TODO Auto-generated method stub + + } + + @Override + public Object createStatement(Object proxy, Method method, Object[] args, Object statement) { + // TODO Auto-generated method stub + String sql = null; + if (method.getName().startsWith("prepare")) { + sql = (args.length>0 && (args[0] instanceof String))?(String)args[0]:null; } + return new StatementProxy(statement,sql); } - protected boolean process(String[] names, Method method, boolean process) { + protected boolean process(final String[] names, Method method, boolean process) { for (int i=0; (!process) && i10) { - StringBuffer out = new StringBuffer("\n\tType:"); - out.append(parent.getClass().getName()); - out.append("\n\tCreate/Prepare args:"); - for (int i=0; this.args!=null && ithreshold) { + String sql = null;//TODO + QueryStats qs = SlowQueryReport.this.queries.get(sql); + if (qs == null) { + qs = new QueryStats(sql); + SlowQueryReport.this.queries.put((String)sql,qs); } - out.append("\n\tExecute args:"); - for (int i=0; args!=null && i() { + @Override + protected boolean removeEldestEntry(Entry eldest) { + return size()>maxQueries; + } + }; + } } }