From 3150673da872b22019dbd18bfa815b03669170bf Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 4 Mar 2017 19:29:42 +0900 Subject: [PATCH] Fixes #835 new change to reduce spinning on connection return when the pool is saturated. --- .../com/zaxxer/hikari/util/ConcurrentBag.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index 229ee26a..a14d85c0 100755 --- a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -123,15 +123,13 @@ public class ConcurrentBag implements AutoCloseab public T borrow(long timeout, final TimeUnit timeUnit) throws InterruptedException { // Try the thread-local list first - if (waiters.get() == 0) { - final List list = threadList.get(); - for (int i = list.size() - 1; i >= 0; i--) { - final Object entry = list.remove(i); - @SuppressWarnings("unchecked") - final T bagEntry = weakThreadLocals ? ((WeakReference) entry).get() : (T) entry; - if (bagEntry != null && bagEntry.compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) { - return bagEntry; - } + final List list = threadList.get(); + for (int i = list.size() - 1; i >= 0; i--) { + final Object entry = list.remove(i); + @SuppressWarnings("unchecked") + final T bagEntry = weakThreadLocals ? ((WeakReference) entry).get() : (T) entry; + if (bagEntry != null && bagEntry.compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) { + return bagEntry; } } @@ -149,7 +147,7 @@ public class ConcurrentBag implements AutoCloseab } listener.addBagItem(waiting); - + timeout = timeUnit.toNanos(timeout); do { final long start = currentTime(); @@ -181,7 +179,7 @@ public class ConcurrentBag implements AutoCloseab { bagEntry.setState(STATE_NOT_IN_USE); - while (waiters.get() > 0) { + while (waiters.get() > 0 && bagEntry.getState() == STATE_NOT_IN_USE) { if (handoffQueue.offer(bagEntry)) { return; }