diff --git a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java index 6b976d3f96..a30ff1952c 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java @@ -46,8 +46,8 @@ public final class DruidConnectionHolder { private final Connection conn; private final List connectionEventListeners = new CopyOnWriteArrayList(); private final List statementEventListeners = new CopyOnWriteArrayList(); - private final long connectTimeMillis; - private transient long lastActiveTimeMillis; + protected final long connectTimeMillis; + protected transient long lastActiveTimeMillis; private long useCount = 0; private long lastNotEmptyWaitNanos; diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index dab220cbc1..d444260d11 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -2254,7 +2254,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } public void shrink(boolean checkTime) { - final List evictList = new ArrayList(); + final DruidConnectionHolder[] evictArray = new DruidConnectionHolder[this.maxActive]; + int evictArrayLength = 0; + try { lock.lockInterruptibly(); } catch (InterruptedException e) { @@ -2269,34 +2271,34 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (checkTime) { if (phyTimeoutMillis > 0) { - long phyConnectTimeMillis = currentTimeMillis - connection.getTimeMillis(); + long phyConnectTimeMillis = currentTimeMillis - connection.connectTimeMillis; if (phyConnectTimeMillis > phyTimeoutMillis) { - evictList.add(connection); + evictArray[evictArrayLength++] = connection; continue; } } - long idleMillis = currentTimeMillis - connection.getLastActiveTimeMillis(); + long idleMillis = currentTimeMillis - connection.lastActiveTimeMillis; if (idleMillis < minEvictableIdleTimeMillis) { break; } if (checkTime && i < checkCount) { - evictList.add(connection); + evictArray[evictArrayLength++] = connection; } else if (idleMillis > maxEvictableIdleTimeMillis) { - evictList.add(connection); + evictArray[evictArrayLength++] = connection; } } else { if (i < checkCount) { - evictList.add(connection); + evictArray[evictArrayLength++] = connection; } else { break; } } } - int removeCount = evictList.size(); + int removeCount = evictArrayLength; if (removeCount > 0) { System.arraycopy(connections, removeCount, connections, 0, poolingCount - removeCount); Arrays.fill(connections, poolingCount - removeCount, poolingCount, null); @@ -2306,7 +2308,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.unlock(); } - for (DruidConnectionHolder item : evictList) { + for (int i = 0; i < evictArrayLength; ++i) { + DruidConnectionHolder item = evictArray[i]; Connection connection = item.getConnection(); JdbcUtils.close(connection); destroyCount.incrementAndGet();