mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
add notFullTimeoutRetryCount support
This commit is contained in:
@@ -118,6 +118,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
protected volatile int minIdle = DEFAULT_MIN_IDLE;
|
||||
protected volatile int maxIdle = DEFAULT_MAX_IDLE;
|
||||
protected volatile long maxWait = DEFAULT_MAX_WAIT;
|
||||
protected int notFullTimeoutRetryCount = 0;
|
||||
|
||||
protected volatile String validationQuery = DEFAULT_VALIDATION_QUERY;
|
||||
protected volatile int validationQueryTimeout = -1;
|
||||
@@ -892,6 +893,15 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
|
||||
|
||||
this.maxWait = maxWaitMillis;
|
||||
}
|
||||
|
||||
public int getNotFullTimeoutRetryCount() {
|
||||
return notFullTimeoutRetryCount;
|
||||
}
|
||||
|
||||
|
||||
public void setNotFullTimeoutRetryCount(int notFullTimeoutRetryCount) {
|
||||
this.notFullTimeoutRetryCount = notFullTimeoutRetryCount;
|
||||
}
|
||||
|
||||
public int getMinIdle() {
|
||||
return minIdle;
|
||||
|
||||
@@ -238,6 +238,17 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
this.setResetStatEnable(value);
|
||||
}
|
||||
}
|
||||
{
|
||||
String property = properties.getProperty("druid.notFullTimeoutRetryCount");
|
||||
if (property != null && property.length() > 0) {
|
||||
try {
|
||||
int value = Integer.parseInt(property);
|
||||
this.setNotFullTimeoutRetryCount(value);
|
||||
} catch (NumberFormatException e) {
|
||||
LOG.error("illegal property 'druid.notFullTimeoutRetryCount'", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isUseGlobalDataSourceStat() {
|
||||
@@ -897,8 +908,22 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
}
|
||||
|
||||
public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throws SQLException {
|
||||
int notFullTimeoutRetryCnt = 0;
|
||||
for (;;) {
|
||||
DruidPooledConnection poolableConnection = getConnectionInternal(maxWaitMillis);
|
||||
// handle notFullTimeoutRetry
|
||||
DruidPooledConnection poolableConnection;
|
||||
try {
|
||||
poolableConnection = getConnectionInternal(maxWaitMillis);
|
||||
} catch (GetConnectionTimeoutException ex) {
|
||||
if (notFullTimeoutRetryCnt <= this.notFullTimeoutRetryCount && !isFull()) {
|
||||
notFullTimeoutRetryCnt++;
|
||||
if (LOG.isWarnEnabled()) {
|
||||
LOG.warn("not full timeout retry : " + notFullTimeoutRetryCnt);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
throw ex;
|
||||
}
|
||||
|
||||
if (isTestOnBorrow()) {
|
||||
boolean validate = testConnectionInternal(poolableConnection.getConnection());
|
||||
@@ -2497,4 +2522,13 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isFull() {
|
||||
lock.lock();
|
||||
try {
|
||||
return this.poolingCount + this.activeCount >= this.maxActive;
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.alibaba.druid.bvt.pool;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
|
||||
public class FullTest extends TestCase {
|
||||
|
||||
private DruidDataSource dataSource;
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
dataSource = new DruidDataSource();
|
||||
dataSource.setUrl("jdbc:mock:xxx");
|
||||
dataSource.setTestOnBorrow(false);
|
||||
|
||||
dataSource.init();
|
||||
}
|
||||
|
||||
protected void tearDown() throws Exception {
|
||||
dataSource.close();
|
||||
}
|
||||
|
||||
public void test_restart() throws Exception {
|
||||
Assert.assertEquals(false, dataSource.isFull());
|
||||
dataSource.fill();
|
||||
|
||||
Assert.assertEquals(true, dataSource.isFull());
|
||||
Connection conn = dataSource.getConnection();
|
||||
Assert.assertEquals(true, dataSource.isFull());
|
||||
conn.close();
|
||||
Assert.assertEquals(true, dataSource.isFull());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user