Author: fhanik
Date: Thu Dec 11 17:26:39 2008
New Revision: 725879

URL: http://svn.apache.org/viewvc?rev=725879&view=rev
Log:
Implement JMX notification of query times and query failures

Added:
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java
   (with props)
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml
   (with props)
Modified:
    tomcat/trunk/modules/jdbc-pool/build.xml
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
    
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
    
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestSlowQueryReport.java

Modified: tomcat/trunk/modules/jdbc-pool/build.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/build.xml?rev=725879&r1=725878&r2=725879&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/build.xml (original)
+++ tomcat/trunk/modules/jdbc-pool/build.xml Thu Dec 11 17:26:39 2008
@@ -102,6 +102,9 @@
       <fileset dir="${tomcat.classes}">
         <include name="org/apache/tomcat/jdbc/**" />
       </fileset>
+      <fileset dir="${basedir}/modules/jdbc-pool/java">
+        <include name="org/apache/tomcat/jdbc/**/*.xml" />
+      </fileset>
     </jar>
     <!-- connection pool source file-->
     <jar jarfile="${tomcat-jdbc-src.jar}">

Modified: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=725879&r1=725878&r2=725879&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 Thu Dec 11 17:26:39 2008
@@ -350,7 +350,9 @@
             }catch (Exception x) {
                 log.warn("Unable to inform interceptor of pool start.",x);
                 close(true);
-                throw new SQLException(x);
+                SQLException ex = new SQLException();
+                ex.initCause(x);
+                throw ex;
             }
         }        
         //initialize the pool with its initial set of members
@@ -477,7 +479,7 @@
         } //while
     }
 
-    protected PooledConnection createConnection(long now, PooledConnection 
con) {
+    protected PooledConnection createConnection(long now, PooledConnection 
con) throws SQLException {
         //no connections where available we'll create one
         boolean error = false;
         try {
@@ -502,7 +504,15 @@
             } //end if
         } catch (Exception e) {
             error = true;
-            log.error("Unable to create a new JDBC connection.", e);
+            if (log.isDebugEnabled())
+                log.debug("Unable to create a new JDBC connection.", e);
+            if (e instanceof SQLException) {
+                throw (SQLException)e;
+            } else {
+                SQLException ex = new SQLException(e.getMessage());
+                ex.initCause(e);
+                throw ex;
+            }
         } finally {
             if (error ) {
                 release(con);

Modified: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java?rev=725879&r1=725878&r2=725879&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
 Thu Dec 11 17:26:39 2008
@@ -54,7 +54,7 @@
     protected int removeAbandonedTimeout = 60;
     protected boolean logAbandoned = false;
     protected int loginTimeout = 10000;
-    protected String name = "Tomcat Connection 
Pool["+(poolCounter.addAndGet(1))+":"+System.identityHashCode(PoolProperties.class)+"]";
+    protected String name = "Tomcat Connection 
Pool["+(poolCounter.addAndGet(1))+"-"+System.identityHashCode(PoolProperties.class)+"]";
     protected String password;
     protected String username;
     protected long validationInterval = 30000;

Modified: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java?rev=725879&r1=725878&r2=725879&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
 Thu Dec 11 17:26:39 2008
@@ -73,8 +73,12 @@
             driver = (java.sql.Driver) 
Class.forName(poolProperties.getDriverClassName(),
                                                      true, 
PooledConnection.class.getClassLoader()).newInstance();
         } catch (java.lang.Exception cn) {
-            log.error("Unable to instantiate JDBC driver.", cn);
-            throw new SQLException(cn.getMessage());
+            if (log.isDebugEnabled()) {
+                log.debug("Unable to instantiate JDBC driver.", cn);
+            }
+            SQLException ex = new SQLException(cn.getMessage());
+            ex.initCause(cn);
+            throw ex;
         }
         String driverURL = poolProperties.getUrl();
         String usr = poolProperties.getUsername();

Modified: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java?rev=725879&r1=725878&r2=725879&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReport.java
 Thu Dec 11 17:26:39 2008
@@ -27,6 +27,12 @@
 import java.util.Iterator;
 import java.util.concurrent.ConcurrentHashMap;
 
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.jdbc.pool.ConnectionPool;
@@ -197,7 +203,7 @@
         super.poolClosed(pool);
     }
     
-    protected void reportFailedQuery(String query, Object[] args, final String 
name, long start, Throwable t) {
+    protected String reportFailedQuery(String query, Object[] args, final 
String name, long start, Throwable t) {
         //extract the query string
         String sql = (query==null && args!=null &&  
args.length>0)?(String)args[0]:query;
         //if we do batch execution, then we name the query 'batch'
@@ -209,9 +215,10 @@
             QueryStats qs = getQueryStats(sql);
             if (qs!=null) qs.failure(System.currentTimeMillis()-start,start);
         }
+        return sql;
     }
     
-    protected void reportSlowQuery(String query, Object[] args, final String 
name, long start, long delta) {
+    protected String reportSlowQuery(String query, Object[] args, final String 
name, long start, long delta) {
         //extract the query string
         String sql = (query==null && args!=null &&  
args.length>0)?(String)args[0]:query;
         //if we do batch execution, then we name the query 'batch'
@@ -223,6 +230,7 @@
             QueryStats qs = getQueryStats(sql);
             if (qs!=null) qs.add(delta,start);
         }
+        return sql;
     }
     
     protected QueryStats getQueryStats(String sql) {
@@ -274,6 +282,48 @@
      *
      */
     public static class QueryStats {
+        static final String[] FIELD_NAMES = new String[] {
+            "query",
+            "nrOfInvocations",
+            "maxInvocationTime",
+            "maxInvocationDate",
+            "minInvocationTime",
+            "minInvocationDate",
+            "totalInvocationTime",
+            "failures",
+            "prepareCount",
+            "prepareTime",
+            "lastInvocation"
+        };
+        
+        static final  String[] FIELD_DESCRIPTIONS = new String[] {
+            "The SQL query",
+            "The number of query invocations, a call to executeXXX",
+            "The longest time for this query in milliseconds",
+            "The time and date for when the longest query took place",
+            "The shortest time for this query in milliseconds",
+            "The time and date for when the shortest query took place",
+            "The total amount of milliseconds spent executing this query",
+            "The number of failures for this query",
+            "The number of times this query was prepared 
(prepareStatement/prepareCall)",
+            "The total number of milliseconds spent preparing this query",
+            "The date and time of the last invocation"
+        };
+        
+        static final OpenType[] FIELD_TYPES = new OpenType[] { 
+            SimpleType.STRING,
+            SimpleType.INTEGER,
+            SimpleType.LONG,
+            SimpleType.LONG,
+            SimpleType.LONG,
+            SimpleType.LONG,
+            SimpleType.LONG,
+            SimpleType.LONG,
+            SimpleType.INTEGER,
+            SimpleType.LONG,
+            SimpleType.LONG 
+        };
+
         private final String query;
         private int nrOfInvocations;
         private long maxInvocationTime = Long.MIN_VALUE;
@@ -286,6 +336,18 @@
         private long prepareTime;
         private volatile long lastInvocation = 0;
         
+        public static String[] getFieldNames() {
+            return FIELD_NAMES;
+        }
+        
+        public static String[] getFieldDescriptions() {
+            return FIELD_DESCRIPTIONS;
+        }
+        
+        public static OpenType[] getFieldTypes() {
+            return FIELD_TYPES;
+        }
+        
         public String toString() {
             StringBuffer buf = new StringBuffer("QueryStats[query:");
             buf.append(query);
@@ -313,6 +375,23 @@
             return buf.toString();
         }
         
+        public CompositeDataSupport getCompositeData(final CompositeType type) 
throws OpenDataException{
+            Object[] values = new Object[] {
+                    query,
+                    nrOfInvocations,
+                    maxInvocationTime,
+                    maxInvocationDate,
+                    minInvocationTime,
+                    minInvocationDate,
+                    totalInvocationTime,
+                    failures,
+                    prepareCount,
+                    prepareTime,
+                    lastInvocation
+            };
+            return new CompositeDataSupport(type,FIELD_NAMES,values);
+        }
+        
         public QueryStats(String query) {
             this.query = query;
         }

Added: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java?rev=725879&view=auto
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java
 (added)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java
 Thu Dec 11 17:26:39 2008
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.jdbc.pool.interceptor;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.management.DynamicMBean;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.Notification;
+import javax.management.ObjectName;
+import javax.management.RuntimeOperationsException;
+import javax.management.modelmbean.InvalidTargetObjectTypeException;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.jdbc.pool.ConnectionPool;
+import org.apache.tomcat.jdbc.pool.PooledConnection;
+import org.apache.tomcat.util.modeler.BaseModelMBean;
+import org.apache.tomcat.util.modeler.ManagedBean;
+import org.apache.tomcat.util.modeler.Registry;
+/**
+ * Publishes data to JMX and provides notifications 
+ * when failures happen.
+ * @author fhanik
+ *
+ */
+public class SlowQueryReportJmx extends SlowQueryReport {
+    public static final String SLOW_QUERY_NOTIFICATION = "Slow query";
+    public static final String FAILED_QUERY_NOTIFICATION = "Failed query";
+
+    protected static CompositeType SLOW_QUERY_TYPE; 
+        
+    protected static Log log = LogFactory.getLog(SlowQueryReportJmx.class);
+    
+    
+    protected static ConcurrentHashMap<String,DynamicMBean> mbeans = 
+        new ConcurrentHashMap<String,DynamicMBean>(); 
+    
+    protected String poolName = null;
+    
+    protected static AtomicLong notifySequence = new AtomicLong(0);
+    
+    protected static CompositeType getCompositeType() {
+        if (SLOW_QUERY_TYPE==null) {
+            try {
+                SLOW_QUERY_TYPE = new CompositeType(
+                        SlowQueryReportJmx.class.getName(),
+                        "Composite data type for query statistics",
+                        QueryStats.getFieldNames(),
+                        QueryStats.getFieldDescriptions(),
+                        QueryStats.getFieldTypes());
+            }catch (OpenDataException x) {
+                log.warn("Unable to initialize composite data type for JMX 
stats and notifications.",x);
+            }
+        }
+        return SLOW_QUERY_TYPE;
+    }
+    
+    @Override
+    public void reset(ConnectionPool parent, PooledConnection con) {
+        // TODO Auto-generated method stub
+        super.reset(parent, con);
+        if (parent!=null) poolName = parent.getName(); 
+    }
+
+
+
+    @Override
+    public void poolClosed(ConnectionPool pool) {
+        this.poolName = pool.getName();
+        deregisterJmx();
+        super.poolClosed(pool);
+    }
+
+    @Override
+    public void poolStarted(ConnectionPool pool) {
+        super.poolStarted(pool);
+        this.poolName = pool.getName();
+        registerJmx();
+    }
+
+    @Override
+    protected String reportFailedQuery(String query, Object[] args, String 
name, long start, Throwable t) {
+        query = super.reportFailedQuery(query, args, name, start, t);
+        notifyJmx(query,FAILED_QUERY_NOTIFICATION);
+        return query;
+    }
+
+    protected void notifyJmx(String query, String type) {
+        try {
+            DynamicMBean mbean = mbeans.get(poolName);
+            if (mbean!=null && mbean instanceof BaseModelMBean) {
+                BaseModelMBean bmbean = (BaseModelMBean)mbean;
+                long sequence = notifySequence.incrementAndGet();
+                Notification notification = 
+                    new Notification(type, 
+                                     mbean, 
+                                     sequence, 
+                                     System.currentTimeMillis(),
+                                     query);
+                bmbean.sendNotification(notification);
+            }
+        } catch (RuntimeOperationsException e) {
+            if (log.isDebugEnabled()) {
+                log.debug("Unable to send failed query notification.",e);
+            }
+        } catch (MBeanException e) {
+            if (log.isDebugEnabled()) {
+                log.debug("Unable to send failed query notification.",e);
+            }
+        }
+    }
+
+    @Override
+    protected String reportSlowQuery(String query, Object[] args, String name, 
long start, long delta) {
+        query = super.reportSlowQuery(query, args, name, start, delta);
+        notifyJmx(query,SLOW_QUERY_NOTIFICATION);
+        return query;
+    }
+
+    /**
+     * JMX operation - return the names of all the pools
+     * @return
+     */
+    public String[] getPoolNames() {
+        Set<String> keys = perPoolStats.keySet();
+        return keys.toArray(new String[0]);
+    }
+
+    /**
+     * JMX operation - return the name of the pool
+     * @return
+     */
+    public String getPoolName() {
+        return poolName;
+    }
+    
+    /**
+     * JMX operation - remove all stats for this connection pool
+     */
+    public void resetStats() {
+        ConcurrentHashMap<String,QueryStats> queries = 
perPoolStats.get(poolName);
+        if (queries!=null) {
+            Iterator<String> it = queries.keySet().iterator();
+            while (it.hasNext()) it.remove();
+        }
+    }
+    
+    /**
+     * JMX operation - returns all the queries we have collected.
+     * @return
+     */
+    public CompositeData[] getSlowQueriesCD() throws OpenDataException {
+        CompositeDataSupport[] result = null;
+        ConcurrentHashMap<String,QueryStats> queries = 
perPoolStats.get(poolName);
+        if (queries!=null) {
+            Set<Map.Entry<String,QueryStats>> stats = queries.entrySet();
+            if (stats!=null) {
+                result = new CompositeDataSupport[stats.size()];
+                Iterator<Map.Entry<String,QueryStats>> it = stats.iterator();
+                int pos = 0;
+                while (it.hasNext()) {
+                    Map.Entry<String,QueryStats> entry = it.next();
+                    QueryStats qs = entry.getValue();
+                    result[pos++] = qs.getCompositeData(getCompositeType());
+                }
+            }
+        }
+        return result;
+    }
+    
+    protected void deregisterJmx() {
+        try {
+            DynamicMBean mbean = null;
+            if ((mbean=mbeans.remove(poolName))!=null) {
+                Registry registry = Registry.getRegistry(null, null);
+                ManagedBean managed = 
registry.findManagedBean(this.getClass().getName());
+                if (managed!=null) {
+                    ObjectName oname = new 
ObjectName("org.apache.tomcat.jdbc.pool.jmx:type="+getClass().getName()+",name="
 + poolName);
+                    registry.unregisterComponent(oname);
+                    registry.removeManagedBean(managed);
+                }
+                
+            }
+        } catch (MalformedObjectNameException e) {
+            log.warn("Jmx deregistration failed.",e);
+        } catch (RuntimeOperationsException e) {
+            log.warn("Jmx deregistration failed.",e);
+        }
+        
+    }
+    
+    protected void registerJmx() {
+        try {
+            if (getCompositeType()!=null) {
+                ObjectName oname = new 
ObjectName("org.apache.tomcat.jdbc.pool.jmx:type="+getClass().getName()+",name="
 + poolName);
+                Registry registry = Registry.getRegistry(null, null);
+                
registry.loadDescriptors(getClass().getPackage().getName(),getClass().getClassLoader());
+                ManagedBean managed = 
registry.findManagedBean(this.getClass().getName());
+                DynamicMBean mbean = 
managed!=null?managed.createMBean(this):null;
+                if (mbean!=null && mbeans.putIfAbsent(poolName, mbean)==null) {
+                    registry.getMBeanServer().registerMBean( mbean, oname);
+                } else {
+                    log.warn(SlowQueryReport.class.getName()+ "- No JMX 
support, composite type was not found.");
+                }
+            } else {
+                log.warn(SlowQueryReport.class.getName()+ "- No JMX support, 
composite type was not found.");
+            }
+        } catch (MalformedObjectNameException e) {
+            log.error("Jmx registration failed, no JMX data will be exposed 
for the query stats.",e);
+        } catch (InstanceNotFoundException e) {
+            log.error("Jmx registration failed, no JMX data will be exposed 
for the query stats.",e);
+        } catch (RuntimeOperationsException e) {
+            log.error("Jmx registration failed, no JMX data will be exposed 
for the query stats.",e);
+        } catch (MBeanException e) {
+            log.error("Jmx registration failed, no JMX data will be exposed 
for the query stats.",e);
+        } catch (InstanceAlreadyExistsException e) {
+            log.error("Jmx registration failed, no JMX data will be exposed 
for the query stats.",e);
+        } catch (NotCompliantMBeanException e) {
+            log.error("Jmx registration failed, no JMX data will be exposed 
for the query stats.",e);
+        }
+    }
+}

Propchange: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/SlowQueryReportJmx.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml?rev=725879&view=auto
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml
 (added)
+++ 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml
 Thu Dec 11 17:26:39 2008
@@ -0,0 +1,19 @@
+<mbeans-descriptors>
+
+  <mbean description="Reports " domain="Tomcat" group="jdbc-pool" 
name="SlowQueryReportJmx" 
+         type="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx">
+
+    <attribute description="The name of the connection pool this Jmx bean is 
representing" name="poolName" type="java.lang.String" writeable="false"/>
+    <attribute description="List of all registered connections pools" 
name="poolNames" type="[java.lang.String;" writeable="false"/>
+    <attribute description="All the recorded query stats. " 
name="slowQueriesCD" type="[javax.management.openmbean.CompositeData;" 
writeable="false"/>
+    <operation description="Clears all the query stats" impact="ACTION" 
name="resetStats" returnType="void"/>
+
+    <notification description="Notification sent out by the slow query report 
when a query exceeds the threshhold" name="slow-query">
+      <notification-type>Slow query</notification-type>
+    </notification>
+    
+    <notification description="Notification sent out by the slow query report 
when a query fails execution" name="failed-query">
+      <notification-type>Failed query execution</notification-type>
+    </notification>
+  </mbean>
+</mbeans-descriptors>
\ No newline at end of file

Propchange: 
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/mbeans-descriptors.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestSlowQueryReport.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestSlowQueryReport.java?rev=725879&r1=725878&r2=725879&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestSlowQueryReport.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestSlowQueryReport.java
 Thu Dec 11 17:26:39 2008
@@ -1,3 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.tomcat.jdbc.test;
 
 import java.sql.CallableStatement;
@@ -8,7 +24,7 @@
 import java.util.Map;
 
 import org.apache.tomcat.jdbc.pool.ConnectionPool;
-import org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport;
+import org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx;
 
 public class TestSlowQueryReport extends DefaultTestCase {
 
@@ -20,7 +36,7 @@
         int count = 3;
         this.init();
         this.datasource.setMaxActive(1);
-        this.datasource.setJdbcInterceptors(SlowQueryReport.class.getName());
+        
this.datasource.setJdbcInterceptors(SlowQueryReportJmx.class.getName());
         Connection con = this.datasource.getConnection();
         String slowSql = "select count(1) from test where val1 like 'ewqeq' 
and val2 = 'ewrre' and val3 = 'sdada' and val4 = 'dadada'";
         for (int i=0; i<count; i++) {
@@ -29,11 +45,11 @@
             rs.close();
             st.close();
         }
-        Map<String,SlowQueryReport.QueryStats> map = 
SlowQueryReport.getPoolStats(datasource.getPool().getName());
+        Map<String,SlowQueryReportJmx.QueryStats> map = 
SlowQueryReportJmx.getPoolStats(datasource.getPool().getName());
         assertNotNull(map);
         assertEquals(1,map.size());
         String key = map.keySet().iterator().next();
-        SlowQueryReport.QueryStats stats = map.get(key);
+        SlowQueryReportJmx.QueryStats stats = map.get(key);
         System.out.println("Stats:"+stats);
         
         for (int i=0; i<count; i++) {
@@ -55,14 +71,14 @@
         con.close();
         tearDown();
         //make sure we actually did clean up when the pool closed
-        assertNull(SlowQueryReport.getPoolStats(pool.getName()));
+        assertNull(SlowQueryReportJmx.getPoolStats(pool.getName()));
     }
 
     public void testFastSql() throws Exception {
         int count = 3;
         this.init();
         this.datasource.setMaxActive(1);
-        this.datasource.setJdbcInterceptors(SlowQueryReport.class.getName());
+        
this.datasource.setJdbcInterceptors(SlowQueryReportJmx.class.getName());
         Connection con = this.datasource.getConnection();
         String slowSql = "select 1";
         for (int i=0; i<count; i++) {
@@ -71,20 +87,20 @@
             rs.close();
             st.close();
         }
-        Map<String,SlowQueryReport.QueryStats> map = 
SlowQueryReport.getPoolStats(datasource.getPool().getName());
+        Map<String,SlowQueryReportJmx.QueryStats> map = 
SlowQueryReportJmx.getPoolStats(datasource.getPool().getName());
         assertNotNull(map);
         assertEquals(0,map.size());
         ConnectionPool pool = datasource.getPool();
         con.close();
         tearDown();
-        assertNull(SlowQueryReport.getPoolStats(pool.getName()));
+        assertNull(SlowQueryReportJmx.getPoolStats(pool.getName()));
     }    
     
     public void testFailedSql() throws Exception {
         int count = 3;
         this.init();
         this.datasource.setMaxActive(1);
-        this.datasource.setJdbcInterceptors(SlowQueryReport.class.getName());
+        
this.datasource.setJdbcInterceptors(SlowQueryReportJmx.class.getName());
         Connection con = this.datasource.getConnection();
         String slowSql = "select 1 from non_existent";
         int exceptionCount = 0;
@@ -99,16 +115,16 @@
             st.close();
             
         }
-        Map<String,SlowQueryReport.QueryStats> map = 
SlowQueryReport.getPoolStats(datasource.getPool().getName());
+        Map<String,SlowQueryReportJmx.QueryStats> map = 
SlowQueryReportJmx.getPoolStats(datasource.getPool().getName());
         assertNotNull(map);
         assertEquals(1,map.size());
         ConnectionPool pool = datasource.getPool();
         String key = map.keySet().iterator().next();
-        SlowQueryReport.QueryStats stats = map.get(key);
+        SlowQueryReportJmx.QueryStats stats = map.get(key);
         System.out.println("Stats:"+stats);
         con.close();
         tearDown();
-        assertNull(SlowQueryReport.getPoolStats(pool.getName()));
+        assertNull(SlowQueryReportJmx.getPoolStats(pool.getName()));
     }    
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to