diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 40f71ab30f..3eb9e2b30e 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -266,6 +266,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat Connection realConnection = poolalbeConnection.getConnection(); JdbcUtils.close(realConnection); + this.decrementActiveCountWithLock(); continue; } poolalbeConnection.getConnectionHolder().setLastCheckTimeMillis(System.currentTimeMillis()); @@ -273,6 +274,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat Connection realConnection = poolalbeConnection.getConnection(); if (realConnection.isClosed()) { JdbcUtils.close(realConnection); + this.decrementActiveCountWithLock(); continue; } @@ -286,6 +288,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } JdbcUtils.close(realConnection); + this.decrementActiveCountWithLock(); continue; } poolalbeConnection.getConnectionHolder().setLastCheckTimeMillis(System.currentTimeMillis()); 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..4feec39b3b 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java @@ -31,9 +31,11 @@ public class TestIdle extends TestCase { Connection conn = dataSource.getConnection(); Assert.assertEquals(dataSource.getInitialSize(), driver.getConnections().size()); + Assert.assertEquals(1, dataSource.getActiveCount()); conn.close(); Assert.assertEquals(dataSource.getInitialSize(), driver.getConnections().size()); + Assert.assertEquals(0, dataSource.getActiveCount()); } { @@ -41,11 +43,14 @@ public class TestIdle extends TestCase { Connection[] connections = new Connection[4]; for (int i = 0; i < count; ++i) { connections[i] = dataSource.getConnection(); + Assert.assertEquals(i + 1, dataSource.getActiveCount()); } Assert.assertEquals(4, driver.getConnections().size()); for (int i = 0; i < count; ++i) { connections[i].close(); + Assert.assertEquals(count - i - 1, dataSource.getActiveCount()); } + Assert.assertEquals(0, dataSource.getActiveCount()); Assert.assertEquals(4, driver.getConnections().size()); Thread.sleep(dataSource.getMinEvictableIdleTimeMillis() * 2); @@ -62,10 +67,33 @@ public class TestIdle extends TestCase { Assert.assertEquals(1, dataSource.getPoolingCount()); { Connection conn = dataSource.getConnection(); + Assert.assertEquals(1, dataSource.getActiveCount()); Assert.assertEquals(dataSource.getMinIdle(), driver.getConnections().size()); conn.close(); Assert.assertEquals(dataSource.getMinIdle(), driver.getConnections().size()); + Assert.assertEquals(0, dataSource.getActiveCount()); } + + { + int count = 4; + Connection[] connections = new Connection[4]; + for (int i = 0; i < count; ++i) { + connections[i] = dataSource.getConnection(); + Assert.assertEquals(i + 1, dataSource.getActiveCount()); + } + Assert.assertEquals(4, driver.getConnections().size()); + for (int i = 0; i < count; ++i) { + connections[i].close(); + Assert.assertEquals(count - i - 1, dataSource.getActiveCount()); + } + Assert.assertEquals(4, driver.getConnections().size()); + Assert.assertEquals(0, dataSource.getActiveCount()); + + dataSource.shrink(); + Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals(dataSource.getMinIdle(), driver.getConnections().size()); + } + dataSource.close(); }