Author: markt
Date: Wed Aug 10 13:42:20 2011
New Revision: 1156182

URL: http://svn.apache.org/viewvc?rev=1156182&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51640
Improve the memory leak prevention for leaks triggered by 
java.sql.DriverManager.

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
    tomcat/tc7.0.x/trunk/webapps/docs/config/listeners.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
    svn:mergeinfo = /tomcat/trunk:1156171

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java?rev=1156182&r1=1156181&r2=1156182&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
 Wed Aug 10 13:42:20 2011
@@ -23,6 +23,7 @@ import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.sql.DriverManager;
 
 import javax.imageio.ImageIO;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -150,8 +151,8 @@ public class JreMemoryLeakPreventionList
     }
     
     /**
-     * <code>com.sun.jndi.ldap.LdapPoolManager</code> class spawns a thread 
when it
-     * is initialized if the system property
+     * <code>com.sun.jndi.ldap.LdapPoolManager</code> class spawns a thread 
when
+     * it is initialized if the system property
      * <code>com.sun.jndi.ldap.connect.pool.timeout</code> is greater than 0.
      * That thread inherits the context class loader of the current thread, so
      * that there may be a web application class loader leak if the web app
@@ -162,7 +163,21 @@ public class JreMemoryLeakPreventionList
     public void setLdapPoolProtection(boolean ldapPoolProtection) {
         this.ldapPoolProtection = ldapPoolProtection;
     }
-    
+
+    /**
+     * The first access to {@link DriverManager} will trigger the loading of
+     * all {@link java.sql.Driver}s in the the current class loader. The web
+     * application level memory leak protection can take care of this in most
+     * cases but triggering the loading here has fewer side-effects. 
+     */
+    private boolean driverManagerProtection = true;
+    public boolean isDriverManagerProtection() {
+        return driverManagerProtection;
+    }
+    public void setDriverManagerProtection(boolean driverManagerProtection) {
+        this.driverManagerProtection = driverManagerProtection;
+    }
+
     @Override
     public void lifecycleEvent(LifecycleEvent event) {
         // Initialise these classes when Tomcat starts
@@ -178,6 +193,14 @@ public class JreMemoryLeakPreventionList
                         ClassLoader.getSystemClassLoader());
 
                 /*
+                 * First call to this loads all drivers in the current class
+                 * loader
+                 */
+                if (driverManagerProtection) {
+                    DriverManager.getDrivers();
+                }
+
+                /*
                  * Several components end up calling:
                  * sun.awt.AppContext.getAppContext()
                  * 

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1156182&r1=1156181&r2=1156182&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Wed Aug 10 13:42:20 2011
@@ -54,6 +54,14 @@
   issues to not "pop up" wrt. others).
 -->
 <section name="Tomcat 7.0.21 (markt)">
+  <subsection name="Catalina">
+    <changelog>
+      <add>
+        <bug>51640</bug>: Improve the memory leak prevention for leaks 
triggered
+        by java.sql.DriverManager. (markt)
+      </add>
+    </changelog>
+  </subsection>
   <subsection name="Coyote">
     <changelog>
       <bug>51641</bug>: Use correct key when removing processor instances from

Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/listeners.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/listeners.xml?rev=1156182&r1=1156181&r2=1156182&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/config/listeners.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/config/listeners.xml Wed Aug 10 13:42:20 
2011
@@ -174,6 +174,14 @@
         is <code>true</code>.</p>
       </attribute>
 
+      <attribute name="driverManagerProtection" required="false">
+        <p>The first use of <code>java.sql.DriverManager</code> will trigger 
the
+        loading of JDBNC Driver in the the current class loader. The web
+        application level memory leak protection can take care of this in most
+        cases but triggering the loading here has fewer side-effects. The
+        default is <code>true</code></p>
+      </attribute>
+
       <attribute name="gcDaemonProtection" required="false">
         <p>Enables protection so that calls to
         <code>sun.misc.GC.requestLatency(long)</code> triggered by a web



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

Reply via email to