fix : get connection does not execute sql and return, add config 'checkExecuteTime', use 'lastExecTimeMillis' instead of 'lastActiveTimeMillis'

This commit is contained in:
高铁
2019-10-27 17:19:30 +08:00
parent 07b14e88de
commit 1e8cc71c50
4 changed files with 41 additions and 0 deletions
@@ -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
@@ -51,6 +51,7 @@ public final class DruidConnectionHolder {
protected final List<StatementEventListener> statementEventListeners = new CopyOnWriteArrayList<StatementEventListener>();
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 {
@@ -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<Filter> 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;
}
}
@@ -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();