From c445f3965d3a0f431db80c1e8f4d254040de8da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sat, 12 Mar 2016 11:05:24 +0800 Subject: [PATCH] bug fixed for phyTimeoutMillis --- .../alibaba/druid/pool/DruidDataSource.java | 12 ++-- .../bvt/pool/basic/MaxPhyTimeMillisTest.java | 64 +++++++++++++++++++ 2 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/basic/MaxPhyTimeMillisTest.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index c4b1ba49c1..320fd47c43 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -53,8 +53,6 @@ import javax.sql.ConnectionEventListener; import javax.sql.ConnectionPoolDataSource; import javax.sql.PooledConnection; -import org.apache.ibatis.jdbc.SQL; - import com.alibaba.druid.Constants; import com.alibaba.druid.TransactionTimeoutException; import com.alibaba.druid.VERSION; @@ -2226,10 +2224,12 @@ public class DruidDataSource extends DruidAbstractDataSource DruidConnectionHolder connection = connections[i]; if (checkTime) { - long phyConnectTimeMillis = connection.getTimeMillis() - currentTimeMillis;//physical connection connected time - if (phyTimeoutMillis > 0 && phyConnectTimeMillis > phyTimeoutMillis) { - evictList.add(connection); - continue; + if (phyTimeoutMillis > 0) { + long phyConnectTimeMillis = currentTimeMillis - connection.getTimeMillis(); + if (phyConnectTimeMillis > phyTimeoutMillis) { + evictList.add(connection); + continue; + } } long idleMillis = currentTimeMillis - connection.getLastActiveTimeMillis(); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/MaxPhyTimeMillisTest.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/MaxPhyTimeMillisTest.java new file mode 100644 index 0000000000..8ea1d50876 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/MaxPhyTimeMillisTest.java @@ -0,0 +1,64 @@ +package com.alibaba.druid.bvt.pool.basic; + +import java.sql.Connection; + +import org.junit.Assert; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.GetConnectionTimeoutException; +import com.alibaba.druid.util.JdbcUtils; + +import junit.framework.TestCase; + +public class MaxPhyTimeMillisTest extends TestCase { + + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setTestOnBorrow(false); + dataSource.setMaxActive(50); + dataSource.setMinIdle(5); + dataSource.setMinEvictableIdleTimeMillis(10); + dataSource.setPhyTimeoutMillis(100); + dataSource.setMaxWait(20); + dataSource.init(); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_max() throws Exception { + connect(10); + + Assert.assertEquals(10, dataSource.getPoolingCount()); + Thread.sleep(20); + dataSource.shrink(true); + Assert.assertEquals(5, dataSource.getPoolingCount()); + + Thread.sleep(100); + dataSource.shrink(true); + Assert.assertEquals(0, dataSource.getPoolingCount()); + } + + public int connect(int count) throws Exception { + int successCount = 0; + Connection[] connections = new Connection[count]; + for (int i = 0; i < count; ++i) { + try { + connections[i] = dataSource.getConnection(); + successCount++; + } catch (GetConnectionTimeoutException e) { + // skip + } + } + + for (int i = 0; i < count; ++i) { + JdbcUtils.close(connections[i]); + } + + return successCount; + } +}