diff --git "a/D:\\data.txt" "b/D:\\data.txt" new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 5777ef09f8..b20c089a96 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -699,8 +699,16 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (numTestsPerEvictionRun <= 0) { numTestsPerEvictionRun = 1; } + - for (int i = 0; i < numTestsPerEvictionRun && i < count; ++i) { + final int testCount; + if (numTestsPerEvictionRun <= count) { + testCount = numTestsPerEvictionRun; + } else { + testCount = count; + } + + for (int i = 0; i < testCount; ++i) { ConnectionHolder connection = connections[i]; if (evictCount == 0 && idleCount == 0 && connection == null) { @@ -708,14 +716,14 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } long idleMillis = System.currentTimeMillis() - connection.getLastActiveMillis(); - if (idleMillis >= minEvictableIdleTimeMillis) { + if (idleMillis >= minEvictableIdleTimeMillis && count - evictList.size() > minIdle) { evictList.add(connection); } else { idleList.add(connection); } } - System.arraycopy(connections, numTestsPerEvictionRun, connections, 0, count - numTestsPerEvictionRun); - for (int i = 0; i < numTestsPerEvictionRun; ++i) { + System.arraycopy(connections, testCount, connections, 0, count - testCount); + for (int i = 0; i < testCount; ++i) { connections[--count] = null; } } finally { diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java b/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java index fc7696070e..fcccda62fb 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java @@ -59,7 +59,7 @@ public class TestIdle extends TestCase { Thread.sleep(dataSource.getMinEvictableIdleTimeMillis() * 2); Assert.assertEquals(0, driver.getConnections().size()); - Assert.assertEquals(1, dataSource.getPoolingCount()); + Assert.assertEquals(0, dataSource.getPoolingCount()); { Connection conn = dataSource.getConnection(); Assert.assertEquals(dataSource.getMinIdle(), driver.getConnections().size());