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);