DruidDataSource support failFast

This commit is contained in:
高铁
2016-02-03 09:56:12 +08:00
parent 1554d2bce6
commit 1b596f85c5
3 changed files with 22 additions and 7 deletions
@@ -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();
@@ -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) {