mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for keepAlive
This commit is contained in:
@@ -153,6 +153,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
protected volatile int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
|
||||
protected volatile long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
|
||||
protected volatile long maxEvictableIdleTimeMillis = DEFAULT_MAX_EVICTABLE_IDLE_TIME_MILLIS;
|
||||
protected volatile long keepAliveBetweenTimeMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS * 2;
|
||||
protected volatile long phyTimeoutMillis = DEFAULT_PHY_TIMEOUT_MILLIS;
|
||||
protected volatile long phyMaxUseCount = -1;
|
||||
|
||||
@@ -769,7 +770,19 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
|
||||
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
|
||||
}
|
||||
|
||||
|
||||
public long getKeepAliveBetweenTimeMillis() {
|
||||
return keepAliveBetweenTimeMillis;
|
||||
}
|
||||
|
||||
public void setKeepAliveBetweenTimeMillis(long keepAliveBetweenTimeMillis) {
|
||||
if (keepAliveBetweenTimeMillis < 1000 * 30) {
|
||||
LOG.error("keepAliveBetweenTimeMillis should be greater than 30000");
|
||||
}
|
||||
|
||||
this.keepAliveBetweenTimeMillis = keepAliveBetweenTimeMillis;
|
||||
}
|
||||
|
||||
public long getMaxEvictableIdleTimeMillis() {
|
||||
return maxEvictableIdleTimeMillis;
|
||||
}
|
||||
|
||||
@@ -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 lastKeepTimeMillis;
|
||||
protected volatile long lastValidTimeMillis;
|
||||
protected long useCount = 0;
|
||||
private long keepAliveCheckCount = 0;
|
||||
@@ -345,7 +346,13 @@ public final class DruidConnectionHolder {
|
||||
|
||||
if (lastActiveTimeMillis > 0) {
|
||||
buf.append(", LastActiveTime:\"");
|
||||
buf.append(Utils.toString(new Date(this.lastActiveTimeMillis)));
|
||||
buf.append(Utils.toString(new Date(lastActiveTimeMillis)));
|
||||
buf.append("\"");
|
||||
}
|
||||
|
||||
if (lastKeepTimeMillis > 0) {
|
||||
buf.append(", LastKeepTimeMillis:\"");
|
||||
buf.append(Utils.toString(new Date(lastKeepTimeMillis)));
|
||||
buf.append("\"");
|
||||
}
|
||||
|
||||
|
||||
@@ -407,6 +407,17 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
this.setKeepAlive(value);
|
||||
}
|
||||
}
|
||||
{
|
||||
String property = properties.getProperty("druid.keepAliveBetweenTimeMillis");
|
||||
if (property != null && property.length() > 0) {
|
||||
try {
|
||||
long value = Long.parseLong(property);
|
||||
this.setKeepAliveBetweenTimeMillis(value);
|
||||
} catch (NumberFormatException e) {
|
||||
LOG.error("illegal property 'druid.keepAliveBetweenTimeMillis'", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
Boolean value = getBoolean(properties, "druid.poolPreparedStatements");
|
||||
if (value != null) {
|
||||
@@ -1354,8 +1365,15 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
|
||||
if (testWhileIdle) {
|
||||
final DruidConnectionHolder holder = poolableConnection.holder;
|
||||
long currentTimeMillis = System.currentTimeMillis();
|
||||
long lastActiveTimeMillis = poolableConnection.holder.lastActiveTimeMillis;
|
||||
long lastActiveTimeMillis = holder.lastActiveTimeMillis;
|
||||
long lastKeepTimeMillis = holder.lastKeepTimeMillis;
|
||||
|
||||
if (lastKeepTimeMillis > lastActiveTimeMillis) {
|
||||
lastActiveTimeMillis = lastKeepTimeMillis;
|
||||
}
|
||||
|
||||
long idleMillis = currentTimeMillis - lastActiveTimeMillis;
|
||||
|
||||
long timeBetweenEvictionRunsMillis = this.timeBetweenEvictionRunsMillis;
|
||||
@@ -1863,6 +1881,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
* close datasource
|
||||
*/
|
||||
public void close() {
|
||||
if (LOG.isInfoEnabled()) {
|
||||
LOG.info("{dataSource-" + this.getID() + "} closing ...");
|
||||
}
|
||||
|
||||
lock.lock();
|
||||
try {
|
||||
if (this.closed) {
|
||||
@@ -2666,6 +2688,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
|
||||
public class DestroyTask implements Runnable {
|
||||
public DestroyTask() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -2869,15 +2894,23 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
|
||||
long idleMillis = currentTimeMillis - connection.lastActiveTimeMillis;
|
||||
|
||||
if (idleMillis < minEvictableIdleTimeMillis) {
|
||||
if (idleMillis < minEvictableIdleTimeMillis
|
||||
&& idleMillis < keepAliveBetweenTimeMillis
|
||||
) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (checkTime && i < checkCount) {
|
||||
evictConnections[evictCount++] = connection;
|
||||
} else if (idleMillis > maxEvictableIdleTimeMillis) {
|
||||
evictConnections[evictCount++] = connection;
|
||||
} else if (keepAlive) {
|
||||
if (idleMillis >= minEvictableIdleTimeMillis) {
|
||||
if (checkTime && i < checkCount) {
|
||||
evictConnections[evictCount++] = connection;
|
||||
continue;
|
||||
} else if (idleMillis > maxEvictableIdleTimeMillis) {
|
||||
evictConnections[evictCount++] = connection;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (keepAlive && idleMillis >= keepAliveBetweenTimeMillis) {
|
||||
keepAliveConnections[keepAliveCount++] = connection;
|
||||
}
|
||||
} else {
|
||||
@@ -2911,7 +2944,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
|
||||
if (keepAliveCount > 0) {
|
||||
this.getDataSourceStat().addKeepAliveCheckCount(keepAliveCount);
|
||||
// keep order
|
||||
for (int i = keepAliveCount - 1; i >= 0; --i) {
|
||||
DruidConnectionHolder holer = keepAliveConnections[i];
|
||||
@@ -2931,7 +2963,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
|
||||
boolean discard = !validate;
|
||||
if (validate) {
|
||||
holer.lastActiveTimeMillis = System.currentTimeMillis();
|
||||
holer.lastKeepTimeMillis = System.currentTimeMillis();
|
||||
boolean putOk = put(holer);
|
||||
if (!putOk) {
|
||||
discard = true;
|
||||
@@ -2957,6 +2989,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
}
|
||||
}
|
||||
this.getDataSourceStat().addKeepAliveCheckCount(keepAliveCount);
|
||||
Arrays.fill(keepAliveConnections, null);
|
||||
}
|
||||
}
|
||||
@@ -3134,6 +3167,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
if (connHolder.lastActiveTimeMillis > 0) {
|
||||
map.put("lastActiveTime", new Date(connHolder.lastActiveTimeMillis));
|
||||
}
|
||||
if (connHolder.lastKeepTimeMillis > 0) {
|
||||
map.put("lastKeepTimeMillis", new Date(connHolder.lastKeepTimeMillis));
|
||||
}
|
||||
map.put("connectTime", new Date(connHolder.getTimeMillis()));
|
||||
map.put("holdability", connHolder.getUnderlyingHoldability());
|
||||
map.put("transactionIsolation", connHolder.getUnderlyingTransactionIsolation());
|
||||
|
||||
@@ -342,6 +342,11 @@ public class DruidPooledStatement extends PoolableWrapper implements Statement {
|
||||
|
||||
long currentTimeMillis = System.currentTimeMillis();
|
||||
long lastActiveTimeMillis = holder.lastActiveTimeMillis;
|
||||
|
||||
if (lastActiveTimeMillis < holder.lastKeepTimeMillis) {
|
||||
lastActiveTimeMillis = holder.lastKeepTimeMillis;
|
||||
}
|
||||
|
||||
long idleMillis = currentTimeMillis - lastActiveTimeMillis;
|
||||
long lastValidIdleMillis = currentTimeMillis - holder.lastActiveTimeMillis;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user