From 899be14b8a69f7e5911b77d5a109309a832a2515 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 17 Aug 2012 07:53:09 +0800 Subject: [PATCH] add dynamic change maxActive support --- .../alibaba/druid/pool/DruidDataSource.java | 10 ++++- .../druid/bvt/pool/MaxActiveChangeTest.java | 45 +++++++++++++++---- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index f50e74fe50..b752155e6c 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -252,6 +252,14 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (this.maxActive == maxActive) { return; } + + if (maxActive < this.minIdle) { + throw new IllegalArgumentException("maxActive less than minIdle, " + maxActive + " < " + this.minIdle); + } + + if (maxActive == 0) { + throw new IllegalArgumentException("maxActive can't not set zero"); + } if (!inited) { this.maxActive = maxActive; @@ -259,7 +267,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } if (LOG.isInfoEnabled()) { - LOG.info("set maxActive " + this.maxActive + " -> " + maxActive); + LOG.info("maxActive modified : " + this.maxActive + " -> " + maxActive); } lock.lock(); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/MaxActiveChangeTest.java b/src/test/java/com/alibaba/druid/bvt/pool/MaxActiveChangeTest.java index 9145a1a2d8..a7eef8e904 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/MaxActiveChangeTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/MaxActiveChangeTest.java @@ -45,35 +45,62 @@ public class MaxActiveChangeTest extends TestCase { Assert.assertEquals(3, connect(4)); Assert.assertEquals(3, dataSource.getPoolingCount()); } - + dataSource.setMaxActive(4); - + for (int i = 0; i < 10; ++i) { Assert.assertEquals(4, connect(4)); Assert.assertEquals(4, dataSource.getPoolingCount()); } - + dataSource.shrink(); Assert.assertEquals(1, dataSource.getPoolingCount()); - + for (int i = 0; i < 10; ++i) { Assert.assertEquals(4, connect(4)); Assert.assertEquals(4, dataSource.getPoolingCount()); } - + Assert.assertEquals(4, dataSource.getPoolingCount()); dataSource.setMaxActive(3); - + Assert.assertEquals(4, dataSource.getPoolingCount()); - + dataSource.shrink(); Assert.assertEquals(1, dataSource.getPoolingCount()); - + // 确保收缩之后不会再长上去 for (int i = 0; i < 10; ++i) { Assert.assertEquals(3, connect(4)); Assert.assertEquals(3, dataSource.getPoolingCount()); } + + dataSource.setMaxActive(2); + dataSource.shrink(); + Assert.assertEquals(1, dataSource.getPoolingCount()); + + for (int i = 0; i < 10; ++i) { + Assert.assertEquals(2, connect(3)); + Assert.assertEquals(2, dataSource.getPoolingCount()); + } + + dataSource.setMaxActive(1); + dataSource.shrink(); + Assert.assertEquals(1, dataSource.getPoolingCount()); + + for (int i = 0; i < 10; ++i) { + Assert.assertEquals(1, connect(2)); + Assert.assertEquals(1, dataSource.getPoolingCount()); + } + + Exception error = null; + try { + dataSource.setMaxActive(0); + } catch (IllegalArgumentException e) { + error = e; + } + Assert.assertNotNull(error); + Assert.assertEquals(1, dataSource.getMaxActive()); } public int connect(int count) throws Exception { @@ -91,7 +118,7 @@ public class MaxActiveChangeTest extends TestCase { for (int i = 0; i < count; ++i) { JdbcUtils.close(connections[i]); } - + return successCount; } }