From f67735a77e41ba52ddcc79d48c9435152e46b1e1 Mon Sep 17 00:00:00 2001 From: Rodro Date: Thu, 5 Apr 2018 15:33:18 -0300 Subject: [PATCH] Use context classLoader to load driver, if present. Fixes (#105) --- .../v2/c3p0/DriverManagerDataSource.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/java/com/mchange/v2/c3p0/DriverManagerDataSource.java b/src/java/com/mchange/v2/c3p0/DriverManagerDataSource.java index 6274d6f6..efded774 100644 --- a/src/java/com/mchange/v2/c3p0/DriverManagerDataSource.java +++ b/src/java/com/mchange/v2/c3p0/DriverManagerDataSource.java @@ -140,7 +140,16 @@ private synchronized void ensureDriverLoaded() throws SQLException if (! isDriverClassLoaded()) { if (driverClass != null) - Class.forName( driverClass ); + { + Class driverCls = loadDriver(driverClass); + if(!driverCls.getClassLoader().equals(this.getClass().getClassLoader())) + { + logger.warning( "Driver '" + driverClass + "' was loaded with a classloader different than C3P0's. Forcing lookup by name sonce the DriverManager won't fin it from C3P0's classloader." ); + logger.finest("Driver '" + driverClass + "' classloader: " + driverCls.getClassLoader().toString()); + logger.finest("C3P0 classloader: " + this.getClass().getClassLoader().toString()); + setForceUseNamedDriverClass(true); + } + } setDriverClassLoaded( true ); } } @@ -151,6 +160,25 @@ private synchronized void ensureDriverLoaded() throws SQLException } } + private Class loadDriver(String driverClass) throws ClassNotFoundException + { + try + { + return Class.forName(driverClass); + } + catch (ClassNotFoundException e) + { + if (Thread.currentThread().getContextClassLoader() != null) + { + return Class.forName(driverClass, true, Thread.currentThread().getContextClassLoader()); + } + else + { + throw e; + } + } + } + // should NOT be sync'ed -- driver() is sync'ed and that's enough // sync'ing the method creates the danger that one freeze on connect // blocks access to the entire DataSource @@ -273,9 +301,9 @@ private synchronized Driver driver() throws SQLException logger.finer( "Circumventing DriverManager and instantiating driver class '" + driverClass + "' directly. (forceUseNamedDriverClass = " + forceUseNamedDriverClass + ")" ); - try - { - driver = (Driver) Class.forName( driverClass ).newInstance(); + try + { + driver = (Driver) loadDriver(driverClass).newInstance(); this.setDriverClassLoaded( true ); } catch (Exception e)