Author: fhanik
Date: Mon Feb 13 19:07:30 2012
New Revision: 1243655
URL: http://svn.apache.org/viewvc?rev=1243655&view=rev
Log:
Fix for
https://issues.apache.org/bugzilla/show_bug.cgi?id=51582
Added:
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug51582.java
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/pool/interceptor/InduceSlowQuery.java
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=1243655&r1=1243654&r2=1243655&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 Feb 13 19:07:30 2012
@@ -49,7 +49,7 @@ public class SlowQueryReport extends Abs
/**
* the queries that are used for this interceptor.
*/
- protected ConcurrentHashMap<String,QueryStats> queries = null;
+ protected volatile ConcurrentHashMap<String,QueryStats> queries = null;
/**
* Maximum number of queries we will be storing
*/
@@ -104,7 +104,7 @@ public class SlowQueryReport extends Abs
*/
@Override
public void closeInvoked() {
- queries = null;
+
}
@Override
@@ -186,6 +186,8 @@ public class SlowQueryReport extends Abs
super.reset(parent, con);
if (parent!=null)
queries = SlowQueryReport.perPoolStats.get(parent.getName());
+ else
+ queries = null;
}
Added:
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug51582.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug51582.java?rev=1243655&view=auto
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug51582.java
(added)
+++
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug51582.java
Mon Feb 13 19:07:30 2012
@@ -0,0 +1,121 @@
+package org.apache.tomcat.jdbc.bugs;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tomcat.jdbc.pool.ConnectionPool;
+import org.apache.tomcat.jdbc.pool.PoolConfiguration;
+import org.apache.tomcat.jdbc.pool.PoolProperties;
+import org.apache.tomcat.jdbc.test.DefaultProperties;
+
+
+public class Bug51582
+{
+
+ /**
+ * @param args
+ * @throws SQLException
+ */
+ public static void main(String[] args) throws SQLException
+ {
+ org.apache.tomcat.jdbc.pool.DataSource datasource = null;
+ PoolConfiguration p = new DefaultProperties();
+
+ p.setJmxEnabled(true);
+ p.setTestOnBorrow(false);
+ p.setTestOnReturn(false);
+ p.setValidationInterval(1000);
+ p.setTimeBetweenEvictionRunsMillis(2000);
+
+ p.setMaxWait(2000);
+ p.setMinEvictableIdleTimeMillis(1000);
+
+ datasource = new org.apache.tomcat.jdbc.pool.DataSource();
+ datasource.setPoolProperties(p);
+
datasource.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx(threshold=200)");
+ ConnectionPool pool = datasource.createPool();
+
+
+ Connection con = pool.getConnection();
+ Statement st = con.createStatement();
+ try {
+ st.execute("DROP ALIAS SLEEP");
+ }catch (Exception ignore) {}
+ st.execute("CREATE ALIAS SLEEP AS $$\nboolean sleep() {\n try {\n
Thread.sleep(10000);\n return true; } catch
(Exception x) {\n return false;\n }\n}\n$$;");
+ st.close();
+ con.close();
+ int iter = 0;
+ while ((iter++) < 10)
+ {
+ final Connection connection = pool.getConnection();
+ final CallableStatement s = connection.prepareCall("{CALL SLEEP()}");
+
+ List<Thread> threadList = new ArrayList<Thread>();
+
+ for (int l = 0; l < 3; l++)
+ {
+ final int i = l;
+
+ Thread thread = new Thread()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ if (i == 0)
+ {
+ Thread.sleep(1000);
+ s.cancel();
+ }
+ else if (i == 1)
+ {
+ //or use some other statement which will block for a longer
time
+ long start = System.currentTimeMillis();
+ System.out.println("["+getName()+"] Calling SP SLEEP");
+ s.execute();
+ System.out.println("["+getName()+"] Executed SP SLEEP
["+(System.currentTimeMillis()-start)+"]");
+ }
+ else
+ {
+ Thread.sleep(1000);
+ connection.close();
+ }
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+
+ };
+
+ };
+ threadList.add(thread);
+ thread.start();
+ }
+ for (Thread t : threadList)
+ {
+ try
+ {
+ t.join();
+ }
+ catch (InterruptedException e)
+ {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+
+ }
+}
Added:
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/pool/interceptor/InduceSlowQuery.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/pool/interceptor/InduceSlowQuery.java?rev=1243655&view=auto
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/pool/interceptor/InduceSlowQuery.java
(added)
+++
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/pool/interceptor/InduceSlowQuery.java
Mon Feb 13 19:07:30 2012
@@ -0,0 +1,76 @@
+/*
+ * 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.lang.reflect.Method;
+import java.security.SecureRandom;
+
+/**
+ * @author fhanik
+ *
+ */
+public class InduceSlowQuery extends AbstractQueryReport {
+ public static SecureRandom random = new SecureRandom();
+
+ public InduceSlowQuery() {
+ // TODO Auto-generated constructor stub
+ }
+
+ public void doWait() {
+ try {
+ int b = random.nextInt(10);
+ if (b == 0) {
+ Thread.sleep((long) random.nextInt(2000));
+ }
+ } catch (InterruptedException x) {
+
+ }
+
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
+ // TODO Auto-generated method stub
+ Object result = super.invoke(proxy, method, args);
+ return result;
+ }
+
+ @Override
+ protected void prepareCall(String query, long time) {
+ }
+
+ @Override
+ protected void prepareStatement(String sql, long time) {
+ }
+
+ @Override
+ public void closeInvoked() {
+ }
+
+ @Override
+ protected String reportQuery(String query, Object[] args, String name,
long start, long delta) {
+ doWait();
+ return super.reportQuery(query, args, name, start, delta);
+ }
+
+ @Override
+ protected String reportSlowQuery(String query, Object[] args, String name,
long start, long delta) {
+ doWait();
+ return super.reportSlowQuery(query, args, name, start, delta);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]