You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2012/03/29 18:02:27 UTC

svn commit: r1306946 - in /tomcat/trunk/modules/jdbc-pool/src: main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java test/java/org/apache/tomcat/jdbc/test/PoolCleanerTest.java

Author: fhanik
Date: Thu Mar 29 16:02:26 2012
New Revision: 1306946

URL: http://svn.apache.org/viewvc?rev=1306946&view=rev
Log:
Per http://tomcat.markmail.org/thread/j7jk7xalhs7t7op7
Threads in the connection pool should not be created using the context loader, but rather the loader that loaded the pool


Modified:
    tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
    tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/PoolCleanerTest.java

Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=1306946&r1=1306945&r2=1306946&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java (original)
+++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java Thu Mar 29 16:02:26 2012
@@ -1217,13 +1217,16 @@ public class ConnectionPool {
         unregisterCleaner(cleaner);
         cleaners.add(cleaner);
         if (poolCleanTimer == null) {
-            poolCleanTimer = new Timer("PoolCleaner["
-                    + System.identityHashCode(ConnectionPool.class
-                            .getClassLoader()) + ":"
-                    + System.currentTimeMillis() + "]", true);
+            ClassLoader loader = Thread.currentThread().getContextClassLoader();
+            try {
+                Thread.currentThread().setContextClassLoader(ConnectionPool.class.getClassLoader());
+                poolCleanTimer = new Timer("PoolCleaner["+ System.identityHashCode(ConnectionPool.class.getClassLoader()) + ":"+
+                                           System.currentTimeMillis() + "]", true);
+            }finally {
+                Thread.currentThread().setContextClassLoader(loader);
+            }
         }
-        poolCleanTimer.scheduleAtFixedRate(cleaner, cleaner.sleepTime,
-                cleaner.sleepTime);
+        poolCleanTimer.scheduleAtFixedRate(cleaner, cleaner.sleepTime,cleaner.sleepTime);
     }
 
     private static synchronized void unregisterCleaner(PoolCleaner cleaner) {

Modified: tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/PoolCleanerTest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/PoolCleanerTest.java?rev=1306946&r1=1306945&r2=1306946&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/PoolCleanerTest.java (original)
+++ tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/PoolCleanerTest.java Thu Mar 29 16:02:26 2012
@@ -17,6 +17,8 @@
 
 package org.apache.tomcat.jdbc.test;
 
+import java.util.Map;
+
 import org.apache.tomcat.jdbc.pool.ConnectionPool;
 import org.apache.tomcat.jdbc.pool.DataSource;
 
@@ -26,19 +28,33 @@ public class PoolCleanerTest extends Def
         super(name);
     }
 
+    private int countPoolCleanerThreads() {
+        Map<Thread, StackTraceElement[]> threadmap = Thread.getAllStackTraces();
+        int result = 0;
+        for (Thread t : threadmap.keySet()) {
+            if (t.getName().startsWith("PoolCleaner[")) result++;
+        }
+        return result;
+    }
+
     public void testPoolCleaner() throws Exception {
         datasource.getPoolProperties().setTimeBetweenEvictionRunsMillis(2000);
         datasource.getPoolProperties().setTestWhileIdle(true);
         assertEquals("Pool cleaner should not be started yet.",0,ConnectionPool.getPoolCleaners().size() );
         assertNull("Pool timer should be null", ConnectionPool.getPoolTimer());
+        assertEquals("Pool cleaner threads should not be present.",0, countPoolCleanerThreads());
 
         datasource.getConnection().close();
         assertEquals("Pool cleaner should have 1 cleaner.",1,ConnectionPool.getPoolCleaners().size() );
         assertNotNull("Pool timer should not be null", ConnectionPool.getPoolTimer());
+        assertEquals("Pool cleaner threads should be 1.",1, countPoolCleanerThreads());
 
         datasource.close();
         assertEquals("Pool shutdown, no cleaners should be present.",0,ConnectionPool.getPoolCleaners().size() );
         assertNull("Pool timer should be null after shutdown", ConnectionPool.getPoolTimer());
+        assertEquals("Pool cleaner threads should not be present after close.",0, countPoolCleanerThreads());
+
+
     }
 
     public void test2PoolCleaners() throws Exception {
@@ -49,11 +65,13 @@ public class PoolCleanerTest extends Def
 
         assertEquals("Pool cleaner should not be started yet.",0,ConnectionPool.getPoolCleaners().size() );
         assertNull("Pool timer should be null", ConnectionPool.getPoolTimer());
+        assertEquals("Pool cleaner threads should not be present.",0, countPoolCleanerThreads());
 
         datasource.getConnection().close();
         ds2.getConnection().close();
         assertEquals("Pool cleaner should have 2 cleaner.",2,ConnectionPool.getPoolCleaners().size() );
         assertNotNull("Pool timer should not be null", ConnectionPool.getPoolTimer());
+        assertEquals("Pool cleaner threads should be 1.",1, countPoolCleanerThreads());
 
         datasource.close();
         assertEquals("Pool cleaner should have 1 cleaner.",1,ConnectionPool.getPoolCleaners().size() );
@@ -62,6 +80,7 @@ public class PoolCleanerTest extends Def
         ds2.close();
         assertEquals("Pool shutdown, no cleaners should be present.",0,ConnectionPool.getPoolCleaners().size() );
         assertNull("Pool timer should be null after shutdown", ConnectionPool.getPoolTimer());
+        assertEquals("Pool cleaner threads should not be present after close.",0, countPoolCleanerThreads());
     }
 
     public void testIdleTimeout() throws Exception {



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