From 3b262816f84e205f992b0ae79aa811b6090f81ab Mon Sep 17 00:00:00 2001
From: Brett Wooldridge <brett.wooldridge@gmail.com>
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 5131d7c0..513f2141 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)
             {