From 1b596f85c5ebf942c5fd9ddb97a1691042a546e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Wed, 3 Feb 2016 09:56:12 +0800 Subject: [PATCH] DruidDataSource support failFast --- .../alibaba/druid/pool/DruidAbstractDataSource.java | 12 +++++++++++- .../java/com/alibaba/druid/pool/DruidDataSource.java | 12 ++++++++---- .../alibaba/druid/bvt/pool/profile/FailFastTest.java | 5 +++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 87ad6fabc5..ab857261f7 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -1453,7 +1453,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements validateConnection(conn); validatedNanos = System.nanoTime(); - createError = null; + setCreateError(null); } catch (SQLException ex) { setCreateError(ex); throw ex; @@ -1472,6 +1472,16 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } protected void setCreateError(Throwable ex) { + if (ex == null) { + lock.lock(); + try { + createError = null; + } finally { + lock.unlock(); + } + return; + } + createErrorCount.incrementAndGet(); long now = System.currentTimeMillis(); lock.lock(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 46b013d4a5..56712f61a3 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1454,6 +1454,10 @@ public class DruidDataSource extends DruidAbstractDataSource } DruidConnectionHolder takeLast() throws InterruptedException, SQLException { + if (failFast && createError != null) { + throw new DataSourceNotAvailableException(createError); + } + try { while (poolingCount == 0) { if (failFast && createError != null) { @@ -1494,11 +1498,11 @@ public class DruidDataSource extends DruidAbstractDataSource long estimate = nanos; for (;;) { + if (failFast && createError != null) { + throw new DataSourceNotAvailableException(createError); + } + if (poolingCount == 0) { - if (failFast && createError != null) { - throw new DataSourceNotAvailableException(createError); - } - emptySignal(); // send signal to CreateThread create connection if (estimate <= 0) { diff --git a/src/test/java/com/alibaba/druid/bvt/pool/profile/FailFastTest.java b/src/test/java/com/alibaba/druid/bvt/pool/profile/FailFastTest.java index 81a7ab61ba..8db142a7f4 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/profile/FailFastTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/profile/FailFastTest.java @@ -4,6 +4,7 @@ import java.sql.SQLException; import java.util.Properties; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import org.junit.Assert; @@ -48,6 +49,7 @@ public class FailFastTest extends TestCase { public void testDefault() throws Exception { Assert.assertTrue(dataSource.isFailFast()); + final AtomicReference errorHolder = new AtomicReference(null); final CountDownLatch connectStartLatch = new CountDownLatch(1); final CountDownLatch connectEndLatch = new CountDownLatch(1); Thread connectThread = new Thread() { @@ -56,8 +58,7 @@ public class FailFastTest extends TestCase { try { dataSource.getConnection(); } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + errorHolder.set(e); } finally { connectEndLatch.countDown(); }