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