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

Reply via email to