From 43d13ffb10c186a1f37e1f2fbe3524910a9875b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Fri, 5 Feb 2016 12:58:45 +0800 Subject: [PATCH] bug fixed for DruidDataSource fail-fast --- .../druid/pool/DruidAbstractDataSource.java | 4 ++- .../alibaba/druid/pool/DruidDataSource.java | 35 ++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index ab857261f7..f3341420ba 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -1475,7 +1475,9 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements if (ex == null) { lock.lock(); try { - createError = null; + if (createError != null) { + createError = null; + } } finally { lock.unlock(); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index ecfb47edbc..3a2e0c22dc 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1460,11 +1460,12 @@ public class DruidDataSource extends DruidAbstractDataSource try { while (poolingCount == 0) { + emptySignal(); // send signal to CreateThread create connection + if (failFast && createError != null) { throw new DataSourceNotAvailableException(createError); } - emptySignal(); // send signal to CreateThread create connection notEmptyWaitThreadCount++; if (notEmptyWaitThreadCount > notEmptyWaitThreadPeak) { notEmptyWaitThreadPeak = notEmptyWaitThreadCount; @@ -1498,12 +1499,12 @@ public class DruidDataSource extends DruidAbstractDataSource long estimate = nanos; for (;;) { - if (failFast && createError != null) { - throw new DataSourceNotAvailableException(createError); - } - if (poolingCount == 0) { emptySignal(); // send signal to CreateThread create connection + + if (failFast && createError != null) { + throw new DataSourceNotAvailableException(createError); + } if (estimate <= 0) { waitNanosLocal.set(nanos - estimate); @@ -1897,15 +1898,23 @@ public class DruidDataSource extends DruidAbstractDataSource } try { - // 必须存在线程等待,才创建连接 - if (poolingCount >= notEmptyWaitThreadCount) { - empty.await(); + boolean emptyWait = true; + + if (createError != null && poolingCount == 0) { + emptyWait = false; } - - // 防止创建超过maxActive数量的连接 - if (activeCount + poolingCount >= maxActive) { - empty.await(); - continue; + + if (emptyWait) { + // 必须存在线程等待,才创建连接 + if (poolingCount >= notEmptyWaitThreadCount) { + empty.await(); + } + + // 防止创建超过maxActive数量的连接 + if (activeCount + poolingCount >= maxActive) { + empty.await(); + continue; + } } } catch (InterruptedException e) {