From f23f358ad407b1af895c6ac0f103f7a72988b6a1 Mon Sep 17 00:00:00 2001 From: Nitin Date: Mon, 1 Feb 2016 11:57:18 +0530 Subject: [PATCH] avoid 'more' exceptions after connection is detected throwing un-recoverable exception --- .../com/zaxxer/hikari/pool/HikariPool.java | 27 +++++++++++-------- .../com/zaxxer/hikari/pool/PoolEntry.java | 2 +- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 273a5b92..e484244d 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -167,7 +167,7 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL final long now = clockSource.currentTime(); if (poolEntry.isMarkedEvicted() || (clockSource.elapsedMillis(poolEntry.lastAccessed, now) > ALIVE_BYPASS_WINDOW_MS && !isConnectionAlive(poolEntry.connection))) { - closeConnection(poolEntry, "(connection is evicted or dead)"); // Throw away the dead connection and try again + closeConnection(poolEntry, "(connection is evicted or dead)", true); // Throw away the dead connection and try again timeout = hardTimeout - clockSource.elapsedMillis(startTime); } else { @@ -400,22 +400,27 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL /** * Permanently close the real (underlying) connection (eat any exception). * - * @param poolEntry the connection to actually close + * @param poolEntry poolEntry having the connection to close + * @param closureReason reason to close + * @param recoverable false only when the connection is broken because of un-recoverable exception before, true otherwise */ - final void closeConnection(final PoolEntry poolEntry, final String closureReason) + final void closeConnection(final PoolEntry poolEntry, final String closureReason, final boolean recoverable) { if (connectionBag.remove(poolEntry)) { final int tc = totalConnections.decrementAndGet(); if (tc < 0) { LOGGER.warn("{} - Unexpected value of totalConnections={}", poolName, tc, new Exception()); } + final Connection connection = poolEntry.close(); - closeConnectionExecutor.execute(new Runnable() { - @Override - public void run() { - quietlyCloseConnection(connection, closureReason); - } - }); + if (recoverable) { + closeConnectionExecutor.execute(new Runnable() { + @Override + public void run() { + quietlyCloseConnection(connection, closureReason); + } + }); + } } } @@ -522,7 +527,7 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL private void softEvictConnection(final PoolEntry poolEntry, final String reason, final boolean owner) { if (owner || connectionBag.reserve(poolEntry)) { - closeConnection(poolEntry, reason); + closeConnection(poolEntry, reason, true); } else { poolEntry.markEvicted(); @@ -615,7 +620,7 @@ public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateL Collections.sort(idleList, LASTACCESS_COMPARABLE); for (PoolEntry poolEntry : idleList) { if (clockSource.elapsedMillis(poolEntry.lastAccessed, now) > idleTimeout && connectionBag.reserve(poolEntry)) { - closeConnection(poolEntry, "(connection has passed idleTimeout)"); + closeConnection(poolEntry, "(connection has passed idleTimeout)", true); if (--removable == 0) { break; // keep min idle cons }; diff --git a/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java b/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java index f3457b33..3ea0f8bb 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java @@ -121,7 +121,7 @@ final class PoolEntry implements IConcurrentBagEntry void evict(final String closureReason) { - hikariPool.closeConnection(this, closureReason); + hikariPool.closeConnection(this, closureReason, false); } /** Returns millis since lastBorrowed */