diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 4cda1552a8..b287fc917e 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -875,7 +875,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } this.discardConnection(holder.getConnection()); - pooledConnection.disable(); + pooledConnection.disable(t); } throw sqlEx; diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java index 4557d28468..e99ecb205d 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java @@ -53,24 +53,26 @@ import com.alibaba.druid.support.logging.LogFactory; */ public class DruidPooledConnection extends PoolableWrapper implements javax.sql.PooledConnection, Connection { - private final static Log LOG = LogFactory.getLog(DruidPooledConnection.class); + private final static Log LOG = LogFactory.getLog(DruidPooledConnection.class); protected Connection conn; protected volatile DruidConnectionHolder holder; protected TransactionInfo transactionInfo; private final boolean dupCloseLogEnable; - private volatile boolean traceEnable = false; - private boolean disable = false; - private boolean closed = false; + private volatile boolean traceEnable = false; + private boolean disable = false; + private boolean closed = false; private final Thread ownerThread; private long connectedTimeNano; - private volatile boolean running = false; + private volatile boolean running = false; - private volatile boolean abandoned = false; + private volatile boolean abandoned = false; private StackTraceElement[] connectStackTrace; + private Throwable disableError = null; + public DruidPooledConnection(DruidConnectionHolder holder){ super(holder.getConnection()); @@ -148,7 +150,7 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. if (rawStatement.getConnection().isClosed()) { return; } - + LOG.error("clear parameter error", ex); } } @@ -179,10 +181,15 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. } public void disable() { + disable(null); + } + + public void disable(Throwable error) { this.traceEnable = false; this.holder = null; this.transactionInfo = null; this.disable = true; + this.disableError = error; } public boolean isDisable() { @@ -1012,8 +1019,16 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. } public void checkState() throws SQLException { - if (holder == null || closed || disable) { - throw new SQLException("connection is closed"); + if (holder == null) { + throw new SQLException("connection holder is null"); + } + + if (closed) { + throw new SQLException("connection closed"); + } + + if (disable) { + throw new SQLException("connection disabled", disableError); } }