diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 4f0b621982..331e90a308 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -106,6 +106,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected volatile String password; protected volatile String jdbcUrl; protected volatile String driverClass; + protected volatile ClassLoader driverClassLoader; protected volatile Properties connectProperties = new Properties(); protected volatile PasswordCallback passwordCallback; @@ -944,6 +945,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements this.driverClass = driverClass; } + public ClassLoader getDriverClassLoader() { + return driverClassLoader; + } + + public void setDriverClassLoader(ClassLoader driverClassLoader) { + this.driverClassLoader = driverClassLoader; + } + @Override public PrintWriter getLogWriter() { return logWriter; @@ -1499,4 +1508,6 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements // just for code format public final static class ActiveConnectionTraceInfoMap extends ConcurrentIdentityHashMap { } + + public abstract void discardConnection(Connection realConnection); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index c2409aad71..f4e37a2c62 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -379,7 +379,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (MockDriver.class.getName().equals(driverClass)) { driver = MockDriver.instance; } else { - driver = JdbcUtils.createDriver(driverClass); + driver = JdbcUtils.createDriver(driverClassLoader, driverClass); } } else { if (this.driverClass == null) { @@ -699,7 +699,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat * @param realConnection * @throws SQLException */ - private void discardConnection(Connection realConnection) { + public void discardConnection(Connection realConnection) { JdbcUtils.close(realConnection); lock.lock(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java index de12bae323..46df39b4a6 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceFactory.java @@ -109,7 +109,13 @@ public class DruidDataSourceFactory implements ObjectFactory { } } - return createDataSource(properties); + return createDataSourceInternal(properties); + } + + protected DataSource createDataSourceInternal(Properties properties) throws Exception { + DruidDataSource dataSource = new DruidDataSource(); + config(dataSource, properties); + return dataSource; } @SuppressWarnings("rawtypes") diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java index 3ff23b076e..6ddfd4abd3 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java @@ -165,6 +165,22 @@ public class DruidPooledConnection implements javax.sql.PooledConnection, Connec public boolean isDisable() { return disable; } + + public void discard() { + if (this.disable) { + return; + } + + DruidConnectionHolder holder = this.holder; + if (holder == null) { + if (dupCloseLogEnable) { + LOG.error("dup close"); + } + return; + } + + holder.getDataSource().discardConnection(holder.getConnection()); + } @Override public void close() throws SQLException { diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 166bb44ddf..9d1a9e21b4 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -497,8 +497,24 @@ public final class JdbcUtils { return null; } } - + public static Driver createDriver(String driverClassName) throws SQLException { + return createDriver(null, driverClassName); + } + + public static Driver createDriver(ClassLoader classLoader, String driverClassName) throws SQLException { + if (classLoader != null) { + try { + return (Driver) classLoader.loadClass(driverClassName).newInstance(); + } catch (IllegalAccessException e) { + throw new SQLException(e.getMessage(), e); + } catch (InstantiationException e) { + throw new SQLException(e.getMessage(), e); + } catch (ClassNotFoundException e) { + throw new SQLException(e.getMessage(), e); + } + } + try { return (Driver) Class.forName(driverClassName).newInstance(); } catch (IllegalAccessException e) {