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 2009/12/21 17:47:27 UTC

svn commit: r892878 - in /tomcat/tc6.0.x/trunk: ./ STATUS.txt java/org/apache/catalina/loader/JdbcLeakPrevention.java java/org/apache/catalina/loader/LocalStrings.properties java/org/apache/catalina/loader/WebappClassLoader.java

Author: markt
Date: Mon Dec 21 16:47:27 2009
New Revision: 892878

URL: http://svn.apache.org/viewvc?rev=892878&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48214
Add logging when a context fails to unregister a JDBC driver. Don't unregister the jdbc-obdc bridge driver that is loaded by the system classloader.

Modified:
    tomcat/tc6.0.x/trunk/   (props changed)
    tomcat/tc6.0.x/trunk/STATUS.txt
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java

Propchange: tomcat/tc6.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 21 16:47:27 2009
@@ -1,2 +1,2 @@
 /tomcat:883362
-/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770809,77
 0876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885991,886019,888072,889363,889606,889716,890139,890265,890349-890350,890417,8911
 85-891187,891583,892198,892341,892415,892464,892555,892814,892817
+/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770809,77
 0876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885231,885991,886019,888072,889363,889606,889716,890139,890265,890349-890350,8904
 17,891185-891187,891583,892198,892341,892415,892464,892555,892814,892817

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=892878&r1=892877&r2=892878&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Mon Dec 21 16:47:27 2009
@@ -307,14 +307,6 @@
   +1: kkolinko, markt, rjung, jim
   -1:
 
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48214
-  Add logging when a context fails to unregister a JDBC driver. Don't unregister
-  the jdbc-obdc bridge driver that is loaded by the system classloader.
-  http://svn.apache.org/viewvc?view=revision&revision=885231
-  +1: markt, rjung, jim
-  -1: 
-  rjung: "uncleareredReferenceJbdc" -> "unclearedReferenceJbdc" in two places
-
 * Log threads that are started but not stopped by web applications
   http://svn.apache.org/viewvc?view=revision&revision=885241
   http://svn.apache.org/viewvc?view=revision&revision=885260

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java?rev=892878&r1=892877&r2=892878&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/JdbcLeakPrevention.java Mon Dec 21 16:47:27 2009
@@ -21,7 +21,9 @@
 import java.sql.Driver;
 import java.sql.DriverManager;
 import java.sql.SQLException;
+import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.List;
 
 /**
  * This class is loaded by the {@link WebappClassLoader} to enable it to
@@ -36,14 +38,28 @@
  */
 public class JdbcLeakPrevention {
 
-    public void clearJdbcDriverRegistrations() throws SQLException {
+    /* 
+     * This driver is visible to all classloaders but is loaded by the system
+     * class loader so there is no need to unload it.
+     */
+    private static final String JDBC_ODBC_BRIDGE_DRIVER =
+        "sun.jdbc.odbc.JdbcOdbcDriver";
+    
+    public List<String> clearJdbcDriverRegistrations() throws SQLException {
+        List<String> driverNames = new ArrayList<String>();
+        
         // Unregister any JDBC drivers loaded by the class loader that loaded
         // this class - ie the webapp class loader
         Enumeration<Driver> drivers = DriverManager.getDrivers();
         while (drivers.hasMoreElements()) {
             Driver driver = drivers.nextElement();
+            if (JDBC_ODBC_BRIDGE_DRIVER.equals(
+                    driver.getClass().getCanonicalName())) {
+                continue;
+            }
+            driverNames.add(driver.getClass().getCanonicalName());
             DriverManager.deregisterDriver(driver);
         }
-        
+        return driverNames;
     }
 }

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties?rev=892878&r1=892877&r2=892878&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties Mon Dec 21 16:47:27 2009
@@ -31,6 +31,7 @@
 webappClassLoader.illegalJarPath=Illegal JAR entry detected with name {0}
 webappClassLoader.stopped=Illegal access: this web application instance has been stopped already.  Could not load {0}.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
 webappClassLoader.readError=Resource read error: Could not load {0}.
+webappClassLoader.unclearedReferenceJbdc=A web application registered the JBDC driver [{0}] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.   
 webappClassLoader.validationErrorJarPath=Unable to validate JAR entry with name {0}
 webappClassLoader.wrongVersion=(unable to load class {0})
 webappLoader.addRepository=Adding repository {0}

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=892878&r1=892877&r2=892878&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Mon Dec 21 16:47:27 2009
@@ -41,6 +41,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 import java.util.jar.Attributes;
@@ -1692,8 +1693,13 @@
                 defineClass("org.apache.catalina.loader.JdbcLeakPrevention",
                     classBytes, 0, offset);
             Object obj = lpClass.newInstance();
-            obj.getClass().getMethod(
+            @SuppressWarnings("unchecked")
+            List<String> driverNames = (List<String>) obj.getClass().getMethod(
                     "clearJdbcDriverRegistrations").invoke(obj);
+            for (String name : driverNames) {
+                log.error(sm.getString(
+                        "webappClassLoader.unclearedReferenceJbdc", name));
+            }
         } catch (Exception e) {
             // So many things to go wrong above...
             log.warn(sm.getString("webappClassLoader.jdbcRemoveFailed"), e);



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