diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 636766426b..177f5164e7 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -871,6 +871,8 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource protected void handleException(Throwable e) throws SQLException { errorCount.incrementAndGet(); } + + abstract void decrementActiveCountWithLock(); protected abstract void recycle(PoolableConnection pooledConnection) throws SQLException; diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index fc6e3acd04..0b37bf8229 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -86,7 +86,10 @@ public class PoolableConnection implements PooledConnection, Connection { if (dataSource != null) { ExceptionSorter exceptionSorter = dataSource.getExceptionSoter(); if (exceptionSorter != null && exceptionSorter.isExceptionFatal(sqlEx)) { - this.holder = null; // isClosed() is true + if (holder != null) { + dataSource.decrementActiveCountWithLock(); + this.holder = null; // isClosed() is true + } } } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestIdle2.java b/src/test/java/com/alibaba/druid/bvt/pool/TestIdle2.java index e83d5aa316..6a28b10570 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestIdle2.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestIdle2.java @@ -16,10 +16,10 @@ public class TestIdle2 extends TestCase { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mock:xxx"); dataSource.setDriver(driver); - dataSource.setInitialSize(1); + dataSource.setInitialSize(14); dataSource.setMaxActive(14); dataSource.setMaxIdle(14); - dataSource.setMinIdle(1); + dataSource.setMinIdle(14); dataSource.setMinEvictableIdleTimeMillis(50 * 1); dataSource.setTimeBetweenEvictionRunsMillis(10); dataSource.setTestWhileIdle(true); @@ -38,8 +38,7 @@ public class TestIdle2 extends TestCase { conn.close(); Assert.assertEquals(0, dataSource.getDestroyCount()); - Assert.assertEquals(true, driver.getConnections().size() == 2 || driver.getConnections().size() == 1); - Assert.assertEquals(true, dataSource.getCreateCount() == 2 || dataSource.getCreateCount() == 1); + Assert.assertEquals(true, dataSource.getPoolingCount() == driver.getConnections().size()); Assert.assertEquals(0, dataSource.getActiveCount()); } @@ -73,7 +72,7 @@ public class TestIdle2 extends TestCase { Thread.sleep(1); conn.close(); } - Assert.assertEquals(true, dataSource.getPoolingCount() == 2 || dataSource.getPoolingCount() == 1); + Assert.assertEquals(true, dataSource.getPoolingCount() == dataSource.getMaxActive()); dataSource.close(); }