This is an automated email from the ASF dual-hosted git repository.

exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new bdf11707a1 NIFI-15389 Updated DBCPConnectionPool to deregister Drivers 
loaded in classes
bdf11707a1 is described below

commit bdf11707a1d73b97238d5dd8f979438c4c01890d
Author: Bob Paulin <[email protected]>
AuthorDate: Tue Dec 30 15:15:27 2025 -0600

    NIFI-15389 Updated DBCPConnectionPool to deregister Drivers loaded in 
classes
    
    This closes #10693
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../org/apache/nifi/dbcp/DBCPConnectionPool.java     | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp/DBCPConnectionPool.java
 
b/nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp/DBCPConnectionPool.java
index 8464fc76b5..c90cc05de3 100644
--- 
a/nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp/DBCPConnectionPool.java
+++ 
b/nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp/DBCPConnectionPool.java
@@ -262,15 +262,23 @@ public class DBCPConnectionPool extends 
AbstractDBCPConnectionPool implements DB
         }
 
         try {
-            registeredDriver = DriverManager.getDriver(url);
-            return registeredDriver;
+            final Driver driver = DriverManager.getDriver(url);
+            // Ensure drivers that register themselves during class loading 
can be set as the registeredDriver.
+            // This ensures drivers that register themselves can be 
deregistered when the component is removed.
+            if (driver != registeredDriver) {
+                DriverManager.deregisterDriver(registeredDriver);
+
+                registeredDriver = driver;
+                if 
(!registeredDriver.getClass().getClassLoader().equals(getClass().getClassLoader()))
 {
+                    getLogger().warn("Registered Driver [{}] created in 
different ClassLoader: Driver will become unavailable when deregistered", 
registeredDriver);
+                }
+            }
+            return driver;
         } catch (final SQLException e) {
             // In case the driver is not registered by the implementation, we 
explicitly try to register it.
             // deregister existing driver
             try {
-                if (registeredDriver != null) {
-                    DriverManager.deregisterDriver(registeredDriver);
-                }
+                DriverManager.deregisterDriver(registeredDriver);
                 registeredDriver = (Driver) 
clazz.getDeclaredConstructor().newInstance();
                 DriverManager.registerDriver(registeredDriver);
                 return DriverManager.getDriver(url);
@@ -288,7 +296,7 @@ public class DBCPConnectionPool extends 
AbstractDBCPConnectionPool implements DB
             // We need to deregister the driver to allow the 
InstanceClassLoader to be garbage collected.
             DriverManager.deregisterDriver(registeredDriver);
         } catch (SQLException e) {
-            getLogger().warn("Driver could not be deregistered. This may cause 
a memory leak.", e);
+            getLogger().warn("Potential memory leak: Driver could not be 
deregistered [{}]", registeredDriver, e);
         }
     }
 }

Reply via email to