diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 4149b21dd7..05fefa3cda 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -447,15 +447,14 @@ public class PoolableConnection implements PooledConnection, Connection { @Override public T unwrap(Class iface) throws SQLException { - checkOpen(); - + if (conn == null) { + return null; + } return conn.unwrap(iface); } @Override public boolean isWrapperFor(Class iface) throws SQLException { - checkOpen(); - return conn.isWrapperFor(iface); } diff --git a/src/main/java/com/alibaba/druid/pool/PoolableResultSet.java b/src/main/java/com/alibaba/druid/pool/PoolableResultSet.java index 41ae576272..a7bf869585 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableResultSet.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableResultSet.java @@ -42,6 +42,7 @@ public final class PoolableResultSet extends PoolableWrapper implements ResultSe private boolean closed = false; public PoolableResultSet(PoolableStatement stmt, ResultSet rs){ + super(rs); this.stmt = stmt; this.rs = rs; } diff --git a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java index d3b74e66ff..24b9dadda3 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java @@ -30,14 +30,17 @@ import com.alibaba.druid.logging.LogFactory; * @author wenshao */ public class PoolableStatement extends PoolableWrapper implements Statement { - private final static Log LOG = LogFactory.getLog(PoolableStatement.class); - + + private final static Log LOG = LogFactory.getLog(PoolableStatement.class); + private final Statement stmt; protected PoolableConnection conn; protected final List resultSetTrace = new ArrayList(); protected boolean closed = false; public PoolableStatement(PoolableConnection conn, Statement stmt){ + super(stmt); + this.conn = conn; this.stmt = stmt; } diff --git a/src/main/java/com/alibaba/druid/pool/PoolableWrapper.java b/src/main/java/com/alibaba/druid/pool/PoolableWrapper.java index a4ebcdbeae..8760665f05 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableWrapper.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableWrapper.java @@ -23,6 +23,12 @@ import java.sql.Wrapper; */ public class PoolableWrapper implements Wrapper { + private final Wrapper wraaper; + + public PoolableWrapper(Wrapper wraaper){ + this.wraaper = wraaper; + } + @Override public boolean isWrapperFor(Class iface) throws SQLException { if (iface == null) { @@ -32,8 +38,12 @@ public class PoolableWrapper implements Wrapper { if (iface.isInstance(this)) { return true; } + + if (iface.isInstance(wraaper)) { + return true; + } - return false; + return wraaper.isWrapperFor(iface); } @SuppressWarnings("unchecked") @@ -46,8 +56,12 @@ public class PoolableWrapper implements Wrapper { if (iface.isInstance(this)) { return (T) this; } + + if (iface.isInstance(wraaper)) { + return (T) wraaper; + } - return null; + return wraaper.unwrap(iface); } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/Case3.java b/src/test/java/com/alibaba/druid/bvt/pool/Case3.java index 2eed129cdb..ca3546fe8a 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/Case3.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/Case3.java @@ -3,11 +3,11 @@ package com.alibaba.druid.bvt.pool; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.Statement; import junit.framework.Assert; import junit.framework.TestCase; +import com.alibaba.druid.mock.MockStatement; import com.alibaba.druid.pool.DruidDataSource; public class Case3 extends TestCase { @@ -50,14 +50,20 @@ public class Case3 extends TestCase { ResultSet rs = stmt.executeQuery(); rs.next(); + MockStatement mockStmt = stmt.unwrap(MockStatement.class); + Assert.assertEquals(false, mockStmt.isClosed()); + conn.close(); + + Assert.assertEquals(true, mockStmt.isClosed()); Assert.assertEquals(true, stmt.isClosed()); Assert.assertEquals(true, rs.isClosed()); rs.close(); stmt.close(); - + + stmt.execute("SELECT 1"); dataSource.close(); }