diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java index c6bc0de7..642914ec 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java @@ -123,7 +123,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen this.password = password; this.configuration = configuration; - this.poolUtils = new PoolUtilities(); + this.poolUtils = new PoolUtilities(configuration); this.connectionBag = createConcurrentBag(this); this.totalConnections = new AtomicInteger(); this.connectionTimeout = configuration.getConnectionTimeout(); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java index dcff8514..dc8c25a1 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java @@ -1,6 +1,7 @@ package com.zaxxer.hikari.util; import static com.zaxxer.hikari.util.UtilityElf.createInstance; +import static com.zaxxer.hikari.util.UtilityElf.createThreadPoolExecutor; import java.sql.Connection; import java.sql.SQLException; @@ -8,12 +9,15 @@ import java.sql.SQLFeatureNotSupportedException; import java.sql.Statement; import java.util.Properties; import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.sql.DataSource; import org.slf4j.Logger; +import com.zaxxer.hikari.HikariConfig; + public final class PoolUtilities { private volatile boolean IS_JDBC40; @@ -21,6 +25,12 @@ public final class PoolUtilities private volatile boolean jdbc40checked; private volatile boolean jdbc41checked; private volatile boolean queryTimeoutSupported = true; + private volatile ThreadPoolExecutor executorService; + + public PoolUtilities(HikariConfig configuration) + { + executorService = createThreadPoolExecutor(configuration.getMaximumPoolSize(), "HikariCP utility thread (pool " + configuration.getPoolName() + ")", configuration.getThreadFactory(), new ThreadPoolExecutor.DiscardPolicy()); + } /** * Close connection and eat any exception. @@ -31,9 +41,10 @@ public final class PoolUtilities { if (connection != null) { try { + setNetworkTimeout(executorService, connection, TimeUnit.SECONDS.toMillis(30), true); connection.close(); } - catch (SQLException e) { + catch (Exception e) { return; } } diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java index 91715bf1..4011526f 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -238,7 +238,7 @@ public class ShutdownTest @Test public void testThreadedShutdown() throws Exception { - HikariConfig config = new HikariConfig(); + final HikariConfig config = new HikariConfig(); config.setMinimumIdle(5); config.setMaximumPoolSize(5); config.setConnectionTimeout(200); @@ -279,7 +279,7 @@ public class ShutdownTest Assert.fail(e.getMessage()); } finally { - new PoolUtilities().quietlyCloseConnection(connection); + new PoolUtilities(config).quietlyCloseConnection(connection); ds.shutdown(); } };