diff --git a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java index 94ab80a3ec..f586f6a7e6 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java @@ -69,6 +69,7 @@ public final class DruidConnectionHolder { protected int underlyingTransactionIsolation; protected boolean underlyingAutoCommit; protected volatile boolean discard = false; + protected volatile boolean active = false; protected final Map variables; protected final Map globleVariables; final ReentrantLock lock = new ReentrantLock(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index ca461599fb..c2116ad0a7 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1493,6 +1493,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat * 抛弃连接,不进行回收,而是抛弃 * * @param realConnection + * @deprecated */ public void discardConnection(Connection realConnection) { JdbcUtils.close(realConnection); @@ -1526,7 +1527,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat return; } - activeCount--; + if (holder.active) { + activeCount--; + holder.active = false; + } discardCount++; holder.discard = true; @@ -1580,6 +1584,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat try { if (activeCount < maxActive) { activeCount++; + holder.active = true; if (activeCount > activePeak) { activePeak = activeCount; activePeakTime = System.currentTimeMillis(); @@ -1661,7 +1666,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } if (holder != null) { + if (holder.discard) { + continue; + } + activeCount++; + holder.active = true; if (activeCount > activePeak) { activePeak = activeCount; activePeakTime = System.currentTimeMillis(); @@ -1906,7 +1916,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (physicalConnection.isClosed()) { lock.lock(); try { - activeCount--; + if (holder.active) { + activeCount--; + holder.active = false; + } closeCount++; } finally { lock.unlock(); @@ -1923,7 +1936,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.lock(); try { - activeCount--; + if (holder.active) { + activeCount--; + holder.active = false; + } closeCount++; } finally { lock.unlock(); @@ -1950,7 +1966,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.lock(); try { - activeCount--; + if (holder.active) { + activeCount--; + holder.active = false; + } closeCount++; result = putLast(holder, currentTimeMillis); @@ -2113,7 +2132,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } boolean putLast(DruidConnectionHolder e, long lastActiveTimeMillis) { - if (poolingCount >= maxActive) { + if (poolingCount >= maxActive || e.discard) { return false; }