Attempt to bound how long a connection.close() call can take to 30 seconds on JDBC41 drivers.

2.3.0
Brett Wooldridge 10 years ago
parent 67bb3c977f
commit a195e7781a

@ -123,7 +123,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen
this.password = password; this.password = password;
this.configuration = configuration; this.configuration = configuration;
this.poolUtils = new PoolUtilities(); this.poolUtils = new PoolUtilities(configuration);
this.connectionBag = createConcurrentBag(this); this.connectionBag = createConcurrentBag(this);
this.totalConnections = new AtomicInteger(); this.totalConnections = new AtomicInteger();
this.connectionTimeout = configuration.getConnectionTimeout(); this.connectionTimeout = configuration.getConnectionTimeout();

@ -1,6 +1,7 @@
package com.zaxxer.hikari.util; package com.zaxxer.hikari.util;
import static com.zaxxer.hikari.util.UtilityElf.createInstance; import static com.zaxxer.hikari.util.UtilityElf.createInstance;
import static com.zaxxer.hikari.util.UtilityElf.createThreadPoolExecutor;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
@ -8,12 +9,15 @@ import java.sql.SQLFeatureNotSupportedException;
import java.sql.Statement; import java.sql.Statement;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.slf4j.Logger; import org.slf4j.Logger;
import com.zaxxer.hikari.HikariConfig;
public final class PoolUtilities public final class PoolUtilities
{ {
private volatile boolean IS_JDBC40; private volatile boolean IS_JDBC40;
@ -21,6 +25,12 @@ public final class PoolUtilities
private volatile boolean jdbc40checked; private volatile boolean jdbc40checked;
private volatile boolean jdbc41checked; private volatile boolean jdbc41checked;
private volatile boolean queryTimeoutSupported = true; 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. * Close connection and eat any exception.
@ -31,9 +41,10 @@ public final class PoolUtilities
{ {
if (connection != null) { if (connection != null) {
try { try {
setNetworkTimeout(executorService, connection, TimeUnit.SECONDS.toMillis(30), true);
connection.close(); connection.close();
} }
catch (SQLException e) { catch (Exception e) {
return; return;
} }
} }

@ -238,7 +238,7 @@ public class ShutdownTest
@Test @Test
public void testThreadedShutdown() throws Exception public void testThreadedShutdown() throws Exception
{ {
HikariConfig config = new HikariConfig(); final HikariConfig config = new HikariConfig();
config.setMinimumIdle(5); config.setMinimumIdle(5);
config.setMaximumPoolSize(5); config.setMaximumPoolSize(5);
config.setConnectionTimeout(200); config.setConnectionTimeout(200);
@ -279,7 +279,7 @@ public class ShutdownTest
Assert.fail(e.getMessage()); Assert.fail(e.getMessage());
} }
finally { finally {
new PoolUtilities().quietlyCloseConnection(connection); new PoolUtilities(config).quietlyCloseConnection(connection);
ds.shutdown(); ds.shutdown();
} }
}; };

Loading…
Cancel
Save