From 7cd733f9011bb0d5bea3ed6a421c840fd0fef68e Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 24 Apr 2014 22:46:42 +0900 Subject: [PATCH] Fix isConnectionAlive() check when using Connection.isValid(). Clarify logging. --- src/main/java/com/zaxxer/hikari/HikariPool.java | 12 +++++++++--- .../com/zaxxer/hikari/proxy/ConnectionProxy.java | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/HikariPool.java b/src/main/java/com/zaxxer/hikari/HikariPool.java index 81154c6a..7a20eeb2 100644 --- a/src/main/java/com/zaxxer/hikari/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/HikariPool.java @@ -385,9 +385,10 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { timeoutMs = Math.max(1000, timeoutMs); + boolean valid; if (isJdbc4ConnectionTest) { - connection.isValid((int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs)); + valid = connection.isValid((int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs)); } else { @@ -399,6 +400,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener statement.setQueryTimeout((int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs)); } statement.executeQuery(configuration.getConnectionTestQuery()); + valid = true; } finally { @@ -411,7 +413,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener connection.rollback(); } - return true; + return valid; } catch (SQLException e) { @@ -450,7 +452,11 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { try { - totalConnections.decrementAndGet(); + int tc = totalConnections.decrementAndGet(); + if (tc < 0) + { + LOGGER.warn("Internal accounting inconsistency, totalConnections=" + tc, new Exception()); + } connectionProxy.realClose(); } catch (SQLException e) diff --git a/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index dc5afec2..ef3904fd 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -141,7 +141,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy forceClose |= sqlState.startsWith("08") | SQL_ERRORS.contains(sqlState); if (forceClose) { - LOGGER.warn("Connection {} ({}) marked as broken because of SQLSTATE({}), ErrorCode({}): {}", delegate.toString(), parentPool.toString(), sqle.getErrorCode(), sqle.getNextException()); + LOGGER.warn(String.format("Connection %s (%s) marked as broken because of SQLSTATE(%s), ErrorCode(%d).", delegate.toString(), parentPool.toString(), sqlState, sqle.getErrorCode()), sqle); } else if (sqle.getNextException() instanceof SQLException) {