From 1e8cc71c50f9ae9beb99cf762d6b7b168eb9fec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sun, 27 Oct 2019 17:19:30 +0800 Subject: [PATCH] fix : get connection does not execute sql and return, add config 'checkExecuteTime', use 'lastExecTimeMillis' instead of 'lastActiveTimeMillis' --- .../druid/pool/DruidAbstractDataSource.java | 1 + .../druid/pool/DruidConnectionHolder.java | 14 +++++++++++++ .../alibaba/druid/pool/DruidDataSource.java | 21 +++++++++++++++++++ .../druid/pool/DruidPooledConnection.java | 5 +++++ 4 files changed, 41 insertions(+) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 1e76d94d27..6a3aee1fd8 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -1464,6 +1464,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements long currentTimeMillis = System.currentTimeMillis(); if (holder != null) { holder.lastValidTimeMillis = currentTimeMillis; + holder.lastExecTimeMillis = currentTimeMillis; } if (valid && isMySql) { // unexcepted branch diff --git a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java index 26b1f3cf22..f7df789d45 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java @@ -51,6 +51,7 @@ public final class DruidConnectionHolder { protected final List statementEventListeners = new CopyOnWriteArrayList(); protected final long connectTimeMillis; protected volatile long lastActiveTimeMillis; + protected volatile long lastExecTimeMillis; protected volatile long lastKeepTimeMillis; protected volatile long lastValidTimeMillis; protected long useCount = 0; @@ -97,6 +98,7 @@ public final class DruidConnectionHolder { this.connectTimeMillis = System.currentTimeMillis(); this.lastActiveTimeMillis = connectTimeMillis; + this.lastExecTimeMillis = connectTimeMillis; this.underlyingAutoCommit = conn.getAutoCommit(); @@ -153,6 +155,10 @@ public final class DruidConnectionHolder { this.defaultReadOnly = underlyingReadOnly; } + public long getConnectTimeMillis() { + return connectTimeMillis; + } + public boolean isUnderlyingReadOnly() { return underlyingReadOnly; } @@ -193,6 +199,14 @@ public final class DruidConnectionHolder { this.lastActiveTimeMillis = lastActiveMillis; } + public long getLastExecTimeMillis() { + return lastExecTimeMillis; + } + + public void setLastExecTimeMillis(long lastExecTimeMillis) { + this.lastExecTimeMillis = lastExecTimeMillis; + } + public void addTrace(DruidPooledStatement stmt) { lock.lock(); try { diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 7b621a2494..6ff613ee8c 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -172,6 +172,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private volatile boolean keepAlive = false; private boolean asyncInit = false; protected boolean killWhenSocketReadTimeout = false; + protected boolean checkExecuteTime = false; private static List autoFilters = null; private boolean loadSpifilterSkip = false; @@ -526,6 +527,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat loadSpifilterSkip = true; } } + { + String property = System.getProperty("druid.checkExecuteTime"); + if (property != null && !"false".equals(property)) { + checkExecuteTime = true; + } + } } public boolean isKillWhenSocketReadTimeout() { @@ -1426,8 +1433,14 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat final DruidConnectionHolder holder = poolableConnection.holder; long currentTimeMillis = System.currentTimeMillis(); long lastActiveTimeMillis = holder.lastActiveTimeMillis; + long lastExecTimeMillis = holder.lastExecTimeMillis; long lastKeepTimeMillis = holder.lastKeepTimeMillis; + if (checkExecuteTime + && lastExecTimeMillis != lastActiveTimeMillis) { + lastActiveTimeMillis = lastExecTimeMillis; + } + if (lastKeepTimeMillis > lastActiveTimeMillis) { lastActiveTimeMillis = lastKeepTimeMillis; } @@ -3804,4 +3817,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat public boolean isClosed() { return this.closed; } + + public boolean isCheckExecuteTime() { + return checkExecuteTime; + } + + public void setCheckExecuteTime(boolean checkExecuteTime) { + this.checkExecuteTime = checkExecuteTime; + } } diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java index 56f55c60ae..7ee1d6d129 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java @@ -712,12 +712,17 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. try { conn.setAutoCommit(autoCommit); holder.setUnderlyingAutoCommit(autoCommit); + holder.setLastExecTimeMillis(System.currentTimeMillis()); } catch (SQLException ex) { handleException(ex, null); } } protected void transactionRecord(String sql) throws SQLException { + if (holder != null) { + holder.setLastExecTimeMillis(System.currentTimeMillis()); + } + if (transactionInfo == null && (!conn.getAutoCommit())) { DruidAbstractDataSource dataSource = holder.getDataSource(); dataSource.incrementStartTransactionCount();