From b18c786e1d0dad94292d670ee99526946cff502a Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Mon, 6 Jul 2015 22:40:11 +0900 Subject: [PATCH] Minor bugfixes. --- .../java/com/zaxxer/hikari/HikariConfig.java | 6 ++--- .../com/zaxxer/hikari/pool/HikariPool.java | 2 +- .../java/com/zaxxer/hikari/pool/PoolElf.java | 24 ++++++++++--------- .../com/zaxxer/hikari/util/PropertyElf.java | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/HikariConfig.java b/src/main/java/com/zaxxer/hikari/HikariConfig.java index 500377266..cc307c80a 100644 --- a/src/main/java/com/zaxxer/hikari/HikariConfig.java +++ b/src/main/java/com/zaxxer/hikari/HikariConfig.java @@ -79,7 +79,7 @@ public class HikariConfig implements HikariConfigMXBean private String transactionIsolationName; private String username; private boolean isAutoCommit; - private boolean isReadOnly; + private Boolean isReadOnly; private boolean isInitializationFailFast; private boolean isIsolateInternalQueries; private boolean isRegisterMbeans; @@ -529,12 +529,12 @@ public void addHealthCheckProperty(String key, String value) healthCheckProperties.setProperty(key, value); } - public boolean isReadOnly() + public Boolean isReadOnly() { return isReadOnly; } - public void setReadOnly(boolean readOnly) + public void setReadOnly(Boolean readOnly) { this.isReadOnly = readOnly; } diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index eea7b8604..8f7be4f0e 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -176,7 +176,7 @@ public final Connection getConnection(final long hardTimeout) throws SQLExceptio } final long now = clockSource.currentTime(); - if (bagEntry.evicted || (clockSource.elapsedMillis(bagEntry.lastAccess, now) > ALIVE_BYPASS_WINDOW_MS && !poolElf.isConnectionAlive(bagEntry.connection))) { + if (bagEntry.evicted || (clockSource.elapsedMillis(bagEntry.lastAccess, now) > ALIVE_BYPASS_WINDOW_MS && !poolElf.isConnectionAlive(bagEntry.connection, lastConnectionFailure))) { closeConnection(bagEntry, "(connection evicted or dead)"); // Throw away the dead connection and try again timeout = hardTimeout - clockSource.elapsedMillis(startTime, now); } diff --git a/src/main/java/com/zaxxer/hikari/pool/PoolElf.java b/src/main/java/com/zaxxer/hikari/pool/PoolElf.java index cb5d25eb8..9cc37cd66 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolElf.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolElf.java @@ -14,6 +14,7 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import javax.management.MBeanServer; import javax.management.ObjectName; @@ -44,7 +45,7 @@ public final class PoolElf private final HikariConfig config; private final String poolName; private final String catalog; - private final boolean isReadOnly; + private final Boolean isReadOnly; private final boolean isAutoCommit; private final boolean isUseJdbc4Validation; private final boolean isIsolateInternalQueries; @@ -154,12 +155,7 @@ else if (jdbcUrl != null && dataSource == null) { * Setup a connection initial state. * * @param connection a Connection - * @param connectionTimeout - * @param initSql - * @param isAutoCommit auto-commit state - * @param isReadOnly read-only state - * @param transactionIsolation transaction isolation - * @param catalog default catalog + * @param connectionTimeout the connection timeout * @throws SQLException thrown from driver */ void setupConnection(final Connection connection, final long connectionTimeout) throws SQLException @@ -172,7 +168,9 @@ void setupConnection(final Connection connection, final long connectionTimeout) transactionIsolation = (transactionIsolation < 0 ? connection.getTransactionIsolation() : transactionIsolation); connection.setAutoCommit(isAutoCommit); - connection.setReadOnly(isReadOnly); + if (isReadOnly != null) { + connection.setReadOnly(isReadOnly); + } if (transactionIsolation != connection.getTransactionIsolation()) { connection.setTransactionIsolation(transactionIsolation); @@ -191,9 +189,10 @@ void setupConnection(final Connection connection, final long connectionTimeout) * Check whether the connection is alive or not. * * @param connection the connection to test + * @param lastConnectionFailure last connection failure * @return true if the connection is alive, false if it is not alive or we timed out */ - boolean isConnectionAlive(final Connection connection) + boolean isConnectionAlive(final Connection connection, AtomicReference lastConnectionFailure) { try { int timeoutSec = (int) TimeUnit.MILLISECONDS.toSeconds(validationTimeout); @@ -220,6 +219,7 @@ boolean isConnectionAlive(final Connection connection) return true; } catch (SQLException e) { + lastConnectionFailure.set(e); LOGGER.warn("Exception during alive check, Connection ({}) declared dead.", connection, e); return false; } @@ -227,7 +227,7 @@ boolean isConnectionAlive(final Connection connection) void resetConnectionState(final PoolBagEntry poolEntry) throws SQLException { - if (poolEntry.isReadOnly != isReadOnly) { + if (isReadOnly != null && poolEntry.isReadOnly != isReadOnly) { poolEntry.connection.setReadOnly(isReadOnly); } @@ -251,8 +251,10 @@ void resetConnectionState(final PoolBagEntry poolEntry) throws SQLException void resetPoolEntry(final PoolBagEntry poolEntry) { + if (isReadOnly != null) { + poolEntry.setReadOnly(isReadOnly); + } poolEntry.setCatalog(catalog); - poolEntry.setReadOnly(isReadOnly); poolEntry.setAutoCommit(isAutoCommit); poolEntry.setNetworkTimeout(networkTimeout); poolEntry.setTransactionIsolation(transactionIsolation); diff --git a/src/main/java/com/zaxxer/hikari/util/PropertyElf.java b/src/main/java/com/zaxxer/hikari/util/PropertyElf.java index cb2d1e166..ebe3ff5bc 100644 --- a/src/main/java/com/zaxxer/hikari/util/PropertyElf.java +++ b/src/main/java/com/zaxxer/hikari/util/PropertyElf.java @@ -151,7 +151,7 @@ private static void setProperty(Object target, String propName, Object propValue else if (paramClass == long.class) { writeMethod.invoke(target, Long.parseLong(propValue.toString())); } - else if (paramClass == boolean.class) { + else if (paramClass == boolean.class || paramClass == Boolean.class) { writeMethod.invoke(target, Boolean.parseBoolean(propValue.toString())); } else if (paramClass == String.class) {