From 71a1b40a4eafec66dc5d1507c1401643ac6974c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Mon, 19 Apr 2021 13:55:13 +0800 Subject: [PATCH] bug fixed for "timeBetweenEvictionRunsMillis > keepAliveBetweenTimeMillis" --- .../alibaba/druid/pool/DruidAbstractDataSource.java | 4 ++++ .../java/com/alibaba/druid/pool/DruidDataSource.java | 6 +++++- .../alibaba/druid/pool/DruidDataSourceC3P0Adapter.java | 4 +++- .../java/com/alibaba/druid/bvt/pool/KeepAliveTest.java | 10 +++++----- 4 files changed, 17 insertions(+), 7 deletions(-) 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 abstract class DruidAbstractDataSource extends WrapperAdapter implements 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 class DruidDataSource extends DruidAbstractDataSource implements DruidDat 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 class DruidDataSource extends DruidAbstractDataSource implements DruidDat 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 class DruidDataSourceC3P0Adapter implements DataSource, DruidDataSourceC3 } 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 @@ public class KeepAliveTest extends TestCase { 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 class KeepAliveTest extends TestCase { } // assertEquals(dataSource.getMaxActive(), dataSource.getPoolingCount()); - - - Thread.sleep(1000 * 1000); } }