diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 55d9a133..b58160b7 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -35,6 +35,7 @@ import static com.zaxxer.hikari.util.PoolUtilities.quietlySleep; import static com.zaxxer.hikari.util.PoolUtilities.setLoginTimeout; import static com.zaxxer.hikari.util.PoolUtilities.setNetworkTimeout; import static com.zaxxer.hikari.util.PoolUtilities.setQueryTimeout; +import static com.zaxxer.hikari.util.PoolUtilities.setupConnection; import java.sql.Connection; import java.sql.SQLException; @@ -413,6 +414,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener Connection connection = null; try { connection = (username == null && password == null) ? dataSource.getConnection() : dataSource.getConnection(username, password); + isUseNetworkTimeout = isJdbc41Compliant(connection) && (configuration.getConnectionTimeout() != Integer.MAX_VALUE); isUseJdbc4Validation = isJdbc40Compliant(connection); if (!isUseJdbc4Validation && configuration.getConnectionTestQuery() == null) { @@ -422,29 +424,23 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener final boolean timeoutEnabled = (configuration.getConnectionTimeout() != Integer.MAX_VALUE); final long timeoutMs = timeoutEnabled ? Math.max(250L, configuration.getConnectionTimeout()) : 0L; - final int networkTimeout = setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, isUseNetworkTimeout); + final int originalTimeout = setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, isUseNetworkTimeout); transactionIsolation = (transactionIsolation < 0 ? connection.getTransactionIsolation() : transactionIsolation); connectionCustomizer.customize(connection); executeSqlAutoCommit(connection, configuration.getConnectionInitSql()); - connection.setAutoCommit(isAutoCommit); - connection.setTransactionIsolation(transactionIsolation); - connection.setReadOnly(isReadOnly); - if (catalog != null) { - connection.setCatalog(catalog); - } + setupConnection(connection, isAutoCommit, isReadOnly, transactionIsolation, catalog); - setNetworkTimeout(houseKeepingExecutorService, connection, networkTimeout, isUseNetworkTimeout); + setNetworkTimeout(houseKeepingExecutorService, connection, originalTimeout, isUseNetworkTimeout); connectionBag.add(new PoolBagEntry(connection, configuration.getMaxLifetime())); lastConnectionFailure.set(null); return true; } catch (Exception e) { - // We failed, so undo speculative increment of totalConnections - totalConnections.decrementAndGet(); + totalConnections.decrementAndGet(); // We failed, so undo speculative increment of totalConnections lastConnectionFailure.set(e); quietlyCloseConnection(connection); diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java index edfd58f0..56cf3d6d 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java @@ -180,6 +180,26 @@ public final class PoolUtilities return -1; } + /** + * Setup a connection intial state. + * + * @param connection a Connection + * @param isAutoCommit auto-commit state + * @param isReadOnly read-only state + * @param transactionIsolation transaction isolation + * @param catalog default catalog + * @throws SQLException thrown from driver + */ + public static void setupConnection(final Connection connection, final boolean isAutoCommit, final boolean isReadOnly, final int transactionIsolation, final String catalog) throws SQLException + { + connection.setAutoCommit(isAutoCommit); + connection.setTransactionIsolation(transactionIsolation); + connection.setReadOnly(isReadOnly); + if (catalog != null) { + connection.setCatalog(catalog); + } + } + /** * Create a ThreadPoolExecutor. * diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 14acca1d..9295bce2 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -34,6 +34,7 @@ import static com.zaxxer.hikari.util.PoolUtilities.quietlySleep; import static com.zaxxer.hikari.util.PoolUtilities.setLoginTimeout; import static com.zaxxer.hikari.util.PoolUtilities.setNetworkTimeout; import static com.zaxxer.hikari.util.PoolUtilities.setQueryTimeout; +import static com.zaxxer.hikari.util.PoolUtilities.setupConnection; import java.sql.Connection; import java.sql.SQLException; @@ -396,6 +397,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener Connection connection = null; try { connection = (username == null && password == null) ? dataSource.getConnection() : dataSource.getConnection(username, password); + isUseNetworkTimeout = isJdbc41Compliant(connection) && (configuration.getConnectionTimeout() != Integer.MAX_VALUE); isUseJdbc4Validation = isJdbc40Compliant(connection); if (!isUseJdbc4Validation && configuration.getConnectionTestQuery() == null) { @@ -405,29 +407,23 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener final boolean timeoutEnabled = (configuration.getConnectionTimeout() != Integer.MAX_VALUE); final long timeoutMs = timeoutEnabled ? Math.max(250L, configuration.getConnectionTimeout()) : 0L; - final int networkTimeout = setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, isUseNetworkTimeout); + final int originalTimeout = setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, isUseNetworkTimeout); transactionIsolation = (transactionIsolation < 0 ? connection.getTransactionIsolation() : transactionIsolation); connectionCustomizer.customize(connection); executeSqlAutoCommit(connection, configuration.getConnectionInitSql()); - connection.setAutoCommit(isAutoCommit); - connection.setTransactionIsolation(transactionIsolation); - connection.setReadOnly(isReadOnly); - if (catalog != null) { - connection.setCatalog(catalog); - } + setupConnection(connection, isAutoCommit, isReadOnly, transactionIsolation, catalog); - setNetworkTimeout(houseKeepingExecutorService, connection, networkTimeout, isUseNetworkTimeout); + setNetworkTimeout(houseKeepingExecutorService, connection, originalTimeout, isUseNetworkTimeout); connectionBag.add(new PoolBagEntry(connection, configuration.getMaxLifetime())); lastConnectionFailure.set(null); return true; } catch (Exception e) { - // We failed, so undo speculative increment of totalConnections - totalConnections.decrementAndGet(); + totalConnections.decrementAndGet(); // We failed, so undo speculative increment of totalConnections lastConnectionFailure.set(e); quietlyCloseConnection(connection); diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java b/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java index 1c16e787..bf15a428 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java @@ -162,6 +162,26 @@ public final class PoolUtilities return -1; } + /** + * Setup a connection intial state. + * + * @param connection a Connection + * @param isAutoCommit auto-commit state + * @param isReadOnly read-only state + * @param transactionIsolation transaction isolation + * @param catalog default catalog + * @throws SQLException thrown from driver + */ + public static void setupConnection(final Connection connection, final boolean isAutoCommit, final boolean isReadOnly, final int transactionIsolation, final String catalog) throws SQLException + { + connection.setAutoCommit(isAutoCommit); + connection.setTransactionIsolation(transactionIsolation); + connection.setReadOnly(isReadOnly); + if (catalog != null) { + connection.setCatalog(catalog); + } + } + /** * Create a ThreadPoolExecutor. *