diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index f5b5ef40c6..ce777a17a4 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -790,6 +790,10 @@ public void setKeepAliveBetweenTimeMillis(long keepAliveBetweenTimeMillis) { LOG.error("keepAliveBetweenTimeMillis should be greater than 30000"); } + if (keepAliveBetweenTimeMillis <= timeBetweenEvictionRunsMillis) { + LOG.warn("keepAliveBetweenTimeMillis should be greater than timeBetweenEvictionRunsMillis"); + } + this.keepAliveBetweenTimeMillis = keepAliveBetweenTimeMillis; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index ee966d5fdd..807893893a 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -870,6 +870,10 @@ public void init() throws SQLException { throw new SQLException("maxEvictableIdleTimeMillis must be grater than minEvictableIdleTimeMillis"); } + if (keepAlive && keepAliveBetweenTimeMillis <= timeBetweenEvictionRunsMillis) { + throw new SQLException("keepAliveBetweenTimeMillis must be grater than timeBetweenEvictionRunsMillis"); + } + if (this.driverClass != null) { this.driverClass = driverClass.trim(); } @@ -2864,7 +2868,7 @@ public void run() { for (;;) { // 从前面开始删除 try { - if (closed) { + if (closed || closing) { break; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceC3P0Adapter.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceC3P0Adapter.java index e97482328f..6874e99031 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceC3P0Adapter.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceC3P0Adapter.java @@ -165,7 +165,9 @@ public int getIdleConnectionTestPeriod() { } public void setIdleConnectionTestPeriod(int idleConnectionTestPeriod) { - dataSource.setTimeBetweenEvictionRunsMillis(((long) idleConnectionTestPeriod) * 1000L); + long timeBetweenEvictionRunsMillis = ((long) idleConnectionTestPeriod) * 1000L; + dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + dataSource.setKeepAliveBetweenTimeMillis(timeBetweenEvictionRunsMillis * 2); } public int getInitialPoolSize() { diff --git a/src/test/java/com/alibaba/druid/bvt/pool/KeepAliveTest.java b/src/test/java/com/alibaba/druid/bvt/pool/KeepAliveTest.java index 32c262d4cc..bbb431040c 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/KeepAliveTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/KeepAliveTest.java @@ -37,9 +37,12 @@ protected void tearDown() throws Exception { public void test_keepAlive() throws Exception { dataSource.init(); - for (int i = 0; i < 1000; ++i) { - if (dataSource.getMinIdle() == dataSource.getPoolingCount()) { + for (int i = 0; i < 100; ++i) { + int poolingCount = dataSource.getPoolingCount(); + if (poolingCount >= dataSource.getMinIdle()) { break; + } else { + System.out.println("poolingCount : " + poolingCount); } Thread.sleep(10 * 1); } @@ -55,8 +58,5 @@ public void test_keepAlive() throws Exception { } // assertEquals(dataSource.getMaxActive(), dataSource.getPoolingCount()); - - - Thread.sleep(1000 * 1000); } }