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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org