Let PoolUtilities use its own executor. Sharing executors can lead to deadlocks (not observed, but theoretical)

2.3.0
Brett Wooldridge 10 years ago
parent 32fa545e0f
commit 0323a7dacb

@ -372,14 +372,14 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen
final boolean timeoutEnabled = (connectionTimeout != Integer.MAX_VALUE);
final long timeoutMs = timeoutEnabled ? Math.max(250L, connectionTimeout) : 0L;
final int originalTimeout = poolUtils.setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, timeoutEnabled);
final int originalTimeout = poolUtils.setNetworkTimeout(connection, timeoutMs, timeoutEnabled);
transactionIsolation = (transactionIsolation < 0 ? connection.getTransactionIsolation() : transactionIsolation);
poolUtils.setupConnection(connection, isAutoCommit, isReadOnly, transactionIsolation, catalog);
connectionCustomizer.customize(connection);
poolUtils.executeSql(connection, configuration.getConnectionInitSql(), isAutoCommit);
poolUtils.setNetworkTimeout(houseKeepingExecutorService, connection, originalTimeout, timeoutEnabled);
poolUtils.setNetworkTimeout(connection, originalTimeout, timeoutEnabled);
connectionBag.add(new PoolBagEntry(connection, this));
lastConnectionFailure.set(null);

@ -8,7 +8,6 @@ import java.sql.SQLException;
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;
@ -20,14 +19,15 @@ import com.zaxxer.hikari.HikariConfig;
public final class PoolUtilities
{
private final ThreadPoolExecutor executorService;
private volatile boolean IS_JDBC40;
private volatile boolean IS_JDBC41;
private volatile boolean jdbc40checked;
private volatile boolean jdbc41checked;
private volatile boolean queryTimeoutSupported = true;
private volatile ThreadPoolExecutor executorService;
public PoolUtilities(HikariConfig configuration)
public PoolUtilities(final HikariConfig configuration)
{
executorService = createThreadPoolExecutor(configuration.getMaximumPoolSize(), "HikariCP utility thread (pool " + configuration.getPoolName() + ")", configuration.getThreadFactory(), new ThreadPoolExecutor.DiscardPolicy());
}
@ -42,7 +42,7 @@ public final class PoolUtilities
if (connection != null) {
try {
try {
setNetworkTimeout(executorService, connection, TimeUnit.SECONDS.toMillis(30), true);
setNetworkTimeout(connection, TimeUnit.SECONDS.toMillis(30), true);
}
catch (SQLException e) {
// keep going, close anyway
@ -196,12 +196,12 @@ public final class PoolUtilities
* @return the pre-existing network timeout value
* @throws SQLException thrown if the network timeout cannot be set
*/
public int setNetworkTimeout(final Executor executor, final Connection connection, final long timeoutMs, final boolean isUseNetworkTimeout) throws SQLException
public int setNetworkTimeout(final Connection connection, final long timeoutMs, final boolean isUseNetworkTimeout) throws SQLException
{
if ((IS_JDBC41 || !jdbc41checked) && isUseNetworkTimeout) {
try {
final int networkTimeout = connection.getNetworkTimeout();
connection.setNetworkTimeout(executor, (int) timeoutMs);
connection.setNetworkTimeout(executorService, (int) timeoutMs);
IS_JDBC41 = true;
return networkTimeout;
}

@ -9,8 +9,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.zaxxer.hikari.util.UtilityElf;
public class StatementTest
{
private HikariDataSource ds;

@ -160,7 +160,7 @@ public final class HikariPool extends BaseHikariPool
return connection.isValid(timeoutSec);
}
final int networkTimeout = poolUtils.setNetworkTimeout(houseKeepingExecutorService, connection, Math.max(1000, (int) timeoutMs), timeoutEnabled);
final int networkTimeout = poolUtils.setNetworkTimeout(connection, Math.max(1000, (int) timeoutMs), timeoutEnabled);
Statement statement = connection.createStatement();
try {
@ -175,7 +175,7 @@ public final class HikariPool extends BaseHikariPool
connection.rollback();
}
poolUtils.setNetworkTimeout(houseKeepingExecutorService, connection, networkTimeout, timeoutEnabled);
poolUtils.setNetworkTimeout(connection, networkTimeout, timeoutEnabled);
return true;
}

@ -144,7 +144,7 @@ public final class HikariPool extends BaseHikariPool
return connection.isValid(timeoutSec);
}
final int networkTimeout = poolUtils.setNetworkTimeout(houseKeepingExecutorService, connection, Math.max(1000, (int) timeoutMs), timeoutEnabled);
final int networkTimeout = poolUtils.setNetworkTimeout(connection, Math.max(1000, (int) timeoutMs), timeoutEnabled);
try (Statement statement = connection.createStatement()) {
poolUtils.setQueryTimeout(statement, timeoutSec);
@ -155,7 +155,7 @@ public final class HikariPool extends BaseHikariPool
connection.rollback();
}
poolUtils.setNetworkTimeout(houseKeepingExecutorService, connection, networkTimeout, timeoutEnabled);
poolUtils.setNetworkTimeout(connection, networkTimeout, timeoutEnabled);
return true;
}

Loading…
Cancel
Save