Skip to content

Commit

Permalink
Issue #23769 Refactored deregistering JDBC drivers
Browse files Browse the repository at this point in the history
- Old issues with this are not happening with current JDK
- See DriverManager code, changed in Java 8.

Signed-off-by: David Matějček <david.matejcek@omnifish.ee>
  • Loading branch information
dmatej committed Jan 15, 2023
1 parent b4e3ea9 commit ce215ca
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 89 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
import java.security.Permissions;
import java.security.Policy;
import java.security.PrivilegedAction;
import java.sql.Driver;
import java.sql.DriverManager;
import java.text.MessageFormat;
import java.time.Instant;
import java.util.ArrayList;
Expand Down Expand Up @@ -1483,15 +1485,12 @@ public void close() throws IOException {
// Clearing references should be done before setting started to
// false, due to possible side effects.
// In addition, set this classloader as the Thread's context classloader
ClassLoader curCl = null;
final ClassLoader originalCl = Thread.currentThread().getContextClassLoader();
try {
curCl = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(this);
clearReferences();
} finally {
if (curCl != null) {
Thread.currentThread().setContextClassLoader(curCl);
}
Thread.currentThread().setContextClassLoader(originalCl);
}

// FIXME: close is called twice = unclear dependencies and order.
Expand Down Expand Up @@ -1604,20 +1603,24 @@ protected void clearReferences() {


private void clearReferencesJdbc() {
@SuppressWarnings("resource")
final ClassLoader classloader = this;
DriverManager.drivers().filter(driver -> driver.getClass().getClassLoader() == classloader)
.forEach(this::deregisterDriver);
}


private void deregisterDriver(Driver driver) {
try {
List<String> driverNames = new JdbcLeakPrevention().clearJdbcDriverRegistrations(this);
String msg = rb.getString(LogFacade.CLEAR_JDBC);
for (String name : driverNames) {
LOG.log(WARNING, MessageFormat.format(msg, contextName, name));
}
DriverManager.deregisterDriver(driver);
LOG.log(WARNING, LogFacade.CLEAR_JDBC, contextName, driver.getClass().getCanonicalName());
} catch (Exception e) {
LOG.log(WARNING, getString(LogFacade.JDBC_REMOVE_FAILED, contextName), e);
}
}


private void clearReferencesStaticFinal() {

Collection<ResourceEntry> values = resourceEntries.values();
Iterator<ResourceEntry> loadedClasses = values.iterator();
/*
Expand Down

0 comments on commit ce215ca

Please sign in to comment.