Skip to content

Commit

Permalink
add notFullTimeoutRetryCount support
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Jul 6, 2014
1 parent 71fc225 commit 0738382
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 1 deletion.
10 changes: 10 additions & 0 deletions src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -892,6 +893,15 @@ public void setMaxWait(long maxWaitMillis) {

this.maxWait = maxWaitMillis;
}

public int getNotFullTimeoutRetryCount() {
return notFullTimeoutRetryCount;
}


public void setNotFullTimeoutRetryCount(int notFullTimeoutRetryCount) {
this.notFullTimeoutRetryCount = notFullTimeoutRetryCount;
}

public int getMinIdle() {
return minIdle;
Expand Down
36 changes: 35 additions & 1 deletion src/main/java/com/alibaba/druid/pool/DruidDataSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,17 @@ public void configFromPropety(Properties properties) {
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() {
Expand Down Expand Up @@ -897,8 +908,22 @@ public PooledConnection getPooledConnection(String user, String password) throws
}

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());
Expand Down Expand Up @@ -2497,4 +2522,13 @@ private boolean isFillable(int toCount) {
return true;
}
}

public boolean isFull() {
lock.lock();
try {
return this.poolingCount + this.activeCount >= this.maxActive;
} finally {
lock.unlock();
}
}
}
37 changes: 37 additions & 0 deletions src/test/java/com/alibaba/druid/bvt/pool/FullTest.java
Original file line number Diff line number Diff line change
@@ -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());
}
}

0 comments on commit 0738382

Please sign in to comment.