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

Reply via email to