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

Reply via email to