aws / aws-secretsmanager-jdbc

The AWS Secrets Manager JDBC Library enables Java developers to easily connect to SQL databases using secrets stored in AWS Secrets Manager.
Apache License 2.0
159 stars 78 forks source link

TomEE - leak of AWSSecretsManagerOracleDriver objects #53

Open Pete16384 opened 3 years ago

Pete16384 commented 3 years ago

Hello,

We are using the aws-secretsmanager-jdbc library in conjunction with TomEE and have been observing a leak of AWSSecretsManagerOracleDriver objects.

After adding some traces in the aws-secretsmanager-jdbc code, what we understood is:

  1. Each time a connection is created the TomEE framework instantiates a new AWSSecretsManagerOracleDriver object and sets it as the 'driver' attribute of the connection object (line 235 of TomEEDataSourceCreator.java - link here: https://github.com/apache/tomee/blob/master/tomee/tomee-jdbc/src/main/java/org/apache/tomee/jdbc/TomEEDataSourceCreator.java).

  2. When instantiated, the AWSSecretsManagerOracleDriver object registers itself in the 'DriverManager' (line 154 of AWSSecretsManagerDriver.java)

  3. When the connection is destroyed later, the driver object is apparently not deregistered from the 'DriverManager', so its stays indefinitely, which creates the leak.

We tried to disable the DriverManager registration in the AWSSecretsManagerOracleDriver constructor (just leaving the registration in the static initialization block of AWSSecretsManagerOracleDriver) and the leak has effectively disappeared. But we fear to have misunderstood something fundamental and that this workaround is not correct: we admit not being very familiar with the aforementioned frameworks. Could anyone shed some light?

willtong1234 commented 3 years ago

It looks like something the Oracle driver does in their connect method that we can try to replicate is to deregister any duplicate drivers: https://github.com/mikesmithjr/ora-jdbc-source/blob/master/OracleJDBC/src/oracle/jdbc/driver/OracleDriver.java#L328-L344.

Labeling this as an enhancement that we can prioritize appropriately.