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