Fixes #878 Searching for driverClass in both hikari class classloader and Thread Context ClassLoader (#902)

pull/903/head
Uday Shankar 8 years ago committed by Brett Wooldridge
parent 60dbe40e9d
commit ae9d52a362

@ -313,13 +313,32 @@ public class HikariConfig implements HikariConfigMXBean
public void setDriverClassName(String driverClassName)
{
Class<?> driverClass = null;
try {
driverClass = this.getClass().getClassLoader().loadClass(driverClassName);
LOGGER.debug("Driver class found in the HikariConfig class classloader {}", this.getClass().getClassLoader());
} catch (ClassNotFoundException e) {
ClassLoader threadContextClassLoader = Thread.currentThread().getContextClassLoader();
if (threadContextClassLoader != null && threadContextClassLoader != this.getClass().getClassLoader()) {
try {
driverClass = threadContextClassLoader.loadClass(driverClassName);
LOGGER.debug("Driver class found in Thread context class loader {}", threadContextClassLoader);
} catch (ClassNotFoundException e1) {
LOGGER.error("Failed to load class of driverClassName {} in either of HikariConfig class classloader {} or Thread context classloader {}", driverClassName, this.getClass().getClassLoader(), threadContextClassLoader);
}
} else {
LOGGER.error("Failed to load class of driverClassName {} in HikariConfig class classloader {}", driverClassName, this.getClass().getClassLoader());
}
}
if (driverClass == null) {
throw new RuntimeException("Failed to load class of driverClassName [" + driverClassName + "] in either of HikariConfig class loader or Thread context classloader");
}
try {
Class<?> driverClass = this.getClass().getClassLoader().loadClass(driverClassName);
driverClass.newInstance();
this.driverClassName = driverClassName;
}
catch (Exception e) {
throw new RuntimeException("Failed to load class of driverClassName " + driverClassName, e);
throw new RuntimeException("Failed to instantiate class " + driverClassName, e);
}
}

@ -66,12 +66,29 @@ public final class DriverDataSource implements DataSource
if (driver == null) {
LOGGER.warn("Registered driver with driverClassName={} was not found, trying direct instantiation.", driverClassName);
Class<?> driverClass = null;
try {
Class<?> driverClass = this.getClass().getClassLoader().loadClass(driverClassName);
driver = (Driver) driverClass.newInstance();
driverClass = this.getClass().getClassLoader().loadClass(driverClassName);
LOGGER.debug("Driver class found in the HikariConfig class classloader {}", this.getClass().getClassLoader());
} catch (ClassNotFoundException e) {
ClassLoader threadContextClassLoader = Thread.currentThread().getContextClassLoader();
if (threadContextClassLoader != null && threadContextClassLoader != this.getClass().getClassLoader()) {
try {
driverClass = threadContextClassLoader.loadClass(driverClassName);
LOGGER.debug("Driver class found in Thread context class loader {}", threadContextClassLoader);
} catch (ClassNotFoundException e1) {
LOGGER.warn("Failed to load class of driverClassName {} in either of HikariConfig class classloader {} or Thread context classloader {}", driverClassName, this.getClass().getClassLoader(), threadContextClassLoader);
}
} else {
LOGGER.warn("Failed to load class of driverClassName {} in HikariConfig class classloader {}", driverClassName, this.getClass().getClassLoader());
}
}
catch (Exception e) {
LOGGER.warn("Failed to create instance of driver class {}, trying jdbcUrl resolution", driverClassName, e);
if (driverClass != null) {
try {
driver = (Driver) driverClass.newInstance();
} catch (Exception e) {
LOGGER.warn("Failed to create instance of driver class {}, trying jdbcUrl resolution", driverClassName, e);
}
}
}
}

Loading…
Cancel
Save