You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/10/01 13:10:51 UTC
svn commit: r1003481 - in /tomcat/trunk:
java/org/apache/catalina/loader/JdbcLeakPrevention.java
webapps/docs/changelog.xml
Author: markt
Date: Fri Oct 1 11:10:51 2010
New Revision: 1003481
URL: http://svn.apache.org/viewvc?rev=1003481&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49667
Ensure JDBC leak prevention code doesn't trigger the very memory leak it is meant to be fixing.
Modified:
tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java?rev=1003481&r1=1003480&r2=1003481&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java (original)
+++ tomcat/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java Fri Oct 1 11:10:51 2010
@@ -23,6 +23,7 @@ import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.HashSet;
import java.util.List;
/**
@@ -41,16 +42,33 @@ public class JdbcLeakPrevention {
public List<String> clearJdbcDriverRegistrations() throws SQLException {
List<String> driverNames = new ArrayList<String>();
- // This will list all drivers visible to this class loader
+ /*
+ * DriverManager.getDrivers() has a nasty side-effect of registering
+ * drivers that are visible to this class loader but haven't yet been
+ * loaded. Therefore, the first call to this method a) gets the list
+ * of originally loaded drivers and b) triggers the unwanted
+ * side-effect. The second call gets the complete list of drivers
+ * ensuring that both original drivers and any loaded as a result of the
+ * side-effects are all de-registered.
+ */
+ HashSet<Driver> originalDrivers = new HashSet<Driver>();
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
+ originalDrivers.add(drivers.nextElement());
+ }
+ drivers = DriverManager.getDrivers();
+ while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
// Only unload the drivers this web app loaded
if (driver.getClass().getClassLoader() !=
this.getClass().getClassLoader()) {
continue;
}
- driverNames.add(driver.getClass().getCanonicalName());
+ // Only report drivers that were originally registered. Skip any
+ // that were registered as a side-effect of this code.
+ if (originalDrivers.contains(driver)) {
+ driverNames.add(driver.getClass().getCanonicalName());
+ }
DriverManager.deregisterDriver(driver);
}
return driverNames;
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1003481&r1=1003480&r2=1003481&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Oct 1 11:10:51 2010
@@ -66,6 +66,11 @@
(markt)
</fix>
<fix>
+ <bug>49667</bug>: Ensure that using the JDBC driver memory leak
+ prevention code does not cause a one of the memory leaks it is meant to
+ avoid. (markt)
+ </fix>
+ <fix>
<bug>49670</bug>: Restore SSO functionality that was broken by Lifecycle
refactoring. (markt)
</fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org