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: [email protected]
For additional commands, e-mail: [email protected]