From cb72382549a3eecbef54fdc18617a3ed1f497383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Tue, 29 Oct 2019 15:34:32 +0800 Subject: [PATCH] add method : DruidDataSource.discardConnection(ConnectionHolder) --- pom.xml | 4 +- src/main/java/com/alibaba/druid/VERSION.java | 2 +- .../druid/pool/DruidAbstractDataSource.java | 7 ++- .../druid/pool/DruidConnectionHolder.java | 2 +- .../alibaba/druid/pool/DruidDataSource.java | 49 ++++++++++++++----- .../com/alibaba/druid/util/JdbcUtils.java | 5 ++ 6 files changed, 51 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 414c27943d..4d4db226ae 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.alibaba druid - 1.1.20 + 1.1.21_preview_01 jar @@ -21,7 +21,7 @@ true UTF-8 - 1.6 + 1.8 diff --git a/src/main/java/com/alibaba/druid/VERSION.java b/src/main/java/com/alibaba/druid/VERSION.java index 5870e4ab75..a36fe871d6 100644 --- a/src/main/java/com/alibaba/druid/VERSION.java +++ b/src/main/java/com/alibaba/druid/VERSION.java @@ -19,7 +19,7 @@ public final class VERSION { public final static int MajorVersion = 1; public final static int MinorVersion = 1; - public final static int RevisionVersion = 20; + public final static int RevisionVersion = 21; public static String getVersionNumber() { return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion; diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 6a3aee1fd8..ae2daeddf5 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -1473,7 +1473,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs; if (lastPacketReceivedTimeMs > 0 // && mysqlIdleMillis >= timeBetweenEvictionRunsMillis) { - discardConnection(conn); + discardConnection(holder); String errorMsg = "discard long time none received connection. " + ", jdbcUrl : " + jdbcUrl + ", jdbcUrl : " + jdbcUrl @@ -2064,7 +2064,10 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public abstract void discardConnection(Connection realConnection); - + + public void discardConnection(DruidConnectionHolder holder) { + discardConnection(holder.getConnection()); + } public boolean isAsyncCloseConnectionEnable() { if (isRemoveAbandoned()) { diff --git a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java index f7df789d45..94ab80a3ec 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java @@ -68,7 +68,7 @@ public final class DruidConnectionHolder { protected int underlyingHoldability; protected int underlyingTransactionIsolation; protected boolean underlyingAutoCommit; - protected boolean discard = false; + protected volatile boolean discard = 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 6ff613ee8c..ca461599fb 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1418,14 +1418,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat LOG.debug("skip not validate connection."); } - Connection realConnection = poolableConnection.conn; - discardConnection(realConnection); + discardConnection(poolableConnection.holder); continue; } } else { - Connection realConnection = poolableConnection.conn; if (poolableConnection.conn.isClosed()) { - discardConnection(null); // 传入null,避免重复关闭 + discardConnection(poolableConnection.holder); // 传入null,避免重复关闭 continue; } @@ -1462,7 +1460,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat LOG.debug("skip not validate connection."); } - discardConnection(realConnection); + discardConnection(poolableConnection.holder); continue; } } @@ -1512,6 +1510,35 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } + public void discardConnection(DruidConnectionHolder holder) { + if (holder == null) { + return; + } + + Connection conn = holder.getConnection(); + if (conn != null) { + JdbcUtils.close(conn); + } + + lock.lock(); + try { + if (holder.discard) { + return; + } + + activeCount--; + discardCount++; + + holder.discard = true; + + if (activeCount <= minIdle) { + emptySignal(); + } + } finally { + lock.unlock(); + } + } + private DruidPooledConnection getConnectionInternal(long maxWait) throws SQLException { if (closed) { connectErrorCountUpdater.incrementAndGet(this); @@ -1761,7 +1788,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.lock(); try { if ((!conn.isClosed()) || !conn.isDisable()) { - holder.setDiscard(true); conn.disable(error); requireDiscard = true; } @@ -1800,8 +1826,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } - this.discardConnection(holder.getConnection()); - holder.setDiscard(true); + this.discardConnection(holder); } LOG.error("discard connection", error); @@ -1874,7 +1899,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } if (phyMaxUseCount > 0 && holder.useCount >= phyMaxUseCount) { - discardConnection(holder.conn); + discardConnection(holder); return; } @@ -1908,7 +1933,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } if (!enable) { - discardConnection(holder.conn); + discardConnection(holder); return; } @@ -1918,7 +1943,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (phyTimeoutMillis > 0) { long phyConnectTimeMillis = currentTimeMillis - holder.connectTimeMillis; if (phyConnectTimeMillis > phyTimeoutMillis) { - discardConnection(holder.conn); + discardConnection(holder); return; } } @@ -1942,7 +1967,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat holder.clearStatementCache(); if (!holder.discard) { - this.discardConnection(physicalConnection); + discardConnection(holder); holder.discard = true; } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 20a895093e..bc8b70666b 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -85,7 +85,12 @@ public final class JdbcUtils implements JdbcConstants { if (x == null) { return; } + try { + if (x.isClosed()) { + return; + } + x.close(); } catch (Exception e) { LOG.debug("close connection error", e);