From efaf86156ca4a01617743675f6910828dded3245 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 4 Oct 2014 15:19:54 +0900 Subject: [PATCH] Fix issue with improper initialization of lastAccessTime. --- .../com/zaxxer/hikari/pool/HikariPool.java | 22 ++++++++----------- .../com/zaxxer/hikari/pool/PoolBagEntry.java | 13 ++++++++++- .../com/zaxxer/hikari/pool/HikariPool.java | 16 +++++--------- .../com/zaxxer/hikari/pool/PoolBagEntry.java | 13 ++++++++++- 4 files changed, 39 insertions(+), 25 deletions(-) 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 1a63abe5..c780f17c 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 @@ -394,20 +394,16 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener */ private void closeConnection(final PoolBagEntry bagEntry) { - try { - int tc = totalConnections.decrementAndGet(); - if (tc < 0) { - LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); - } - closeConnectionExecutor.submit(new Runnable() { - public void run() { - quietlyCloseConnection(bagEntry.connection); - } - }); - } - finally { - connectionBag.remove(bagEntry); + int tc = totalConnections.decrementAndGet(); + connectionBag.remove(bagEntry); + if (tc < 0) { + LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); } + closeConnectionExecutor.submit(new Runnable() { + public void run() { + quietlyCloseConnection(bagEntry.connection); + } + }); } /** diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java index 4d4d0838..25e258e8 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java @@ -35,7 +35,18 @@ public final class PoolBagEntry extends BagEntry PoolBagEntry(final Connection connection, long maxLifetime) { this.connection = connection; expirationTime = (maxLifetime > 0 ? System.currentTimeMillis() + maxLifetime : Long.MAX_VALUE); - lastAccess = expirationTime; + lastAccess = System.currentTimeMillis(); + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("Connection: ").append(connection).append('\n'); + sb.append("Expiration: ").append(expirationTime).append('\n'); + sb.append("Last access: ").append(lastAccess).append('\n'); + sb.append("Last open: ").append(lastOpenTime); + return sb.toString(); } } 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 821d9db6..d05a7576 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -385,16 +385,12 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener */ private void closeConnection(final PoolBagEntry bagEntry) { - try { - int tc = totalConnections.decrementAndGet(); - if (tc < 0) { - LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); - } - closeConnectionExecutor.submit(() -> { quietlyCloseConnection(bagEntry.connection); }); - } - finally { - connectionBag.remove(bagEntry); + int tc = totalConnections.decrementAndGet(); + connectionBag.remove(bagEntry); + if (tc < 0) { + LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); } + closeConnectionExecutor.submit(() -> { quietlyCloseConnection(bagEntry.connection); }); } /** @@ -469,7 +465,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener } } catch (SQLException e) { - LOGGER.warn("Exception during keep alive check, that means the connection must be dead.", e); + LOGGER.warn("Exception during keep alive check, that means the connection (" + connection + ") must be dead.", e); return false; } } diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java b/hikaricp/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java index 4d4d0838..25e258e8 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java @@ -35,7 +35,18 @@ public final class PoolBagEntry extends BagEntry PoolBagEntry(final Connection connection, long maxLifetime) { this.connection = connection; expirationTime = (maxLifetime > 0 ? System.currentTimeMillis() + maxLifetime : Long.MAX_VALUE); - lastAccess = expirationTime; + lastAccess = System.currentTimeMillis(); + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("Connection: ").append(connection).append('\n'); + sb.append("Expiration: ").append(expirationTime).append('\n'); + sb.append("Last access: ").append(lastAccess).append('\n'); + sb.append("Last open: ").append(lastOpenTime); + return sb.toString(); } }