Skip to content

Commit 3e7b0ac

Browse files
committed
NIFI-15389: Ensure drivers that load within driver class deregister
1 parent 4f6a736 commit 3e7b0ac

File tree

1 file changed

+14
-6
lines changed
  • nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp

1 file changed

+14
-6
lines changed

nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp/DBCPConnectionPool.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,15 +262,23 @@ protected Driver getDriver(final String driverName, final String url) {
262262
}
263263

264264
try {
265-
registeredDriver = DriverManager.getDriver(url);
266-
return registeredDriver;
265+
final Driver driver = DriverManager.getDriver(url);
266+
// Ensure drivers that register themselves during class loading can be set as the registeredDriver.
267+
// This ensures drivers that register themselves can be deregisterd when the componet is removed.
268+
if (driver != registeredDriver) {
269+
DriverManager.deregisterDriver(registeredDriver);
270+
271+
registeredDriver = driver;
272+
if (!registeredDriver.getClass().getClassLoader().equals(getClass().getClassLoader())) {
273+
getLogger().warn("Registered Driver created in a different ClassLoader [{}]. Driver will become unavailable when it is deregisterd.", registeredDriver);
274+
}
275+
}
276+
return driver;
267277
} catch (final SQLException e) {
268278
// In case the driver is not registered by the implementation, we explicitly try to register it.
269279
// deregister existing driver
270280
try {
271-
if (registeredDriver != null) {
272-
DriverManager.deregisterDriver(registeredDriver);
273-
}
281+
DriverManager.deregisterDriver(registeredDriver);
274282
registeredDriver = (Driver) clazz.getDeclaredConstructor().newInstance();
275283
DriverManager.registerDriver(registeredDriver);
276284
return DriverManager.getDriver(url);
@@ -288,7 +296,7 @@ public void onRemove() {
288296
// We need to deregister the driver to allow the InstanceClassLoader to be garbage collected.
289297
DriverManager.deregisterDriver(registeredDriver);
290298
} catch (SQLException e) {
291-
getLogger().warn("Driver could not be deregistered. This may cause a memory leak.", e);
299+
getLogger().warn("Driver could not be deregistered [{}]. This may cause a memory leak.", registeredDriver, e);
292300
}
293301
}
294302
}

0 commit comments

Comments
 (0)