diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index d8ecf86a..bcb46306 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -295,7 +295,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener int sleepBackoff = 200; final int maxPoolSize = configuration.getMaximumPoolSize(); final int minIdle = configuration.getMinimumIdle(); - while (totalConnections.get() < maxPoolSize && (minIdle == 0 || getIdleConnections() < minIdle)) + while (!isShutdown && totalConnections.get() < maxPoolSize && (minIdle == 0 || getIdleConnections() < minIdle)) { if (!addConnection()) { diff --git a/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/src/test/java/com/zaxxer/hikari/ShutdownTest.java index df0788ea..525cdb87 100644 --- a/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -16,6 +16,8 @@ package com.zaxxer.hikari; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; import java.sql.SQLException; import java.util.concurrent.TimeUnit; @@ -149,4 +151,36 @@ public class ShutdownTest Assert.assertSame("Idle connection count not as expected, ", 0, pool.getIdleConnections()); Assert.assertSame("Total connection count not as expected", 0, pool.getTotalConnections()); } + + @Test + public void testShutdown4() throws SQLException + { + int threadCountStart = threadCount(); + + StubConnection.slowCreate = true; + + HikariConfig config = new HikariConfig(); + config.setMinimumIdle(10); + config.setMaximumPoolSize(10); + config.setInitializationFailFast(false); + config.setConnectionTestQuery("VALUES 1"); + config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); + + HikariDataSource ds = new HikariDataSource(config); + + PoolUtilities.quietlySleep(300); + + ds.shutdown(); + + PoolUtilities.quietlySleep(700); + + int threadCountEnd = threadCount(); + Assert.assertSame("Thread was leaked", threadCountStart, threadCountEnd); + } + + private int threadCount() { + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); + + return threadMXBean.getThreadCount(); + } }