[
https://issues.apache.org/jira/browse/NIFI-8429?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Peter Turcsanyi resolved NIFI-8429.
-----------------------------------
Fix Version/s: 1.14.0
Resolution: Fixed
> DBCPConnectionPool leaks registered drivers
> -------------------------------------------
>
> Key: NIFI-8429
> URL: https://issues.apache.org/jira/browse/NIFI-8429
> Project: Apache NiFi
> Issue Type: Bug
> Components: Extensions
> Reporter: Peter Turcsanyi
> Assignee: Simon Bence
> Priority: Major
> Fix For: 1.14.0
>
> Time Spent: 50m
> Remaining Estimate: 0h
>
> {{DBCPConnectionPool}} executes the following steps when it gets enabled:
> (https://github.com/apache/nifi/blob/f0611f31da6b643e9ed4bbf2c98faf6c44e29ba6/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/main/java/org/apache/nifi/dbcp/DBCPConnectionPool.java#L473-L502)
> - creates a custom class loader
> - loads the driver's class via {{Class.forName()}} using the class loader
> created in the previous step => the driver will be registered in
> DriverManager via the driver's static initialiser (1st registration)
> - wraps the driver into {{DriverShim}} and registers it in DriverManager =>
> 2nd registration
> - passes the driver's class name and the class loader to {{commons-dbcp2}}'s
> {{BasicDataSource}} which in the end instantiates the driver directly and
> uses that instance in effect (not the registered ones)
> The registered drivers will never get removed/deregistered from DriverManager
> (each OnEnabled leaks 2 instances). Unused drivers can also hold other
> resources (like threads in case of Oracle driver
> https://support.oracle.com/knowledge/Middleware/1901449_1.html) which can
> lead to further leaking.
> Suggested solution:
> - {{PropertyDescriptor.dynamicallyModifiesClassPath(true)}} could be used
> instead of the custom class loader
> - {{@RequiresInstanceClassLoading}} could be used to load the driver and the
> controller service code in the same class loader (which had been the intended
> purpose of {{DriverShim}} originally)
> - the registered driver could be passed to {{BasicDataSource}} for usage (no
> further instance creation needed)
> This way only one driver instance (per controller service) would be
> registered and used (until the user changes the driver url on the controller
> service). This minimises the number of registered drivers and the resource
> leaking mentioned earlier.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)