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);
}
}
}