You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Simon Bence (Jira)" <ji...@apache.org> on 2021/04/14 13:28:00 UTC

[jira] [Assigned] (NIFI-8429) DBCPConnectionPool leaks registered drivers

     [ https://issues.apache.org/jira/browse/NIFI-8429?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Simon Bence reassigned NIFI-8429:
---------------------------------

    Assignee: Simon Bence

> 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
>
> {{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)