支持RemoveAbondon

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@678 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-09-07 13:05:21 +00:00
parent fae1cb8e30
commit a038728cd4
3 changed files with 69 additions and 9 deletions
@@ -143,7 +143,7 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource
protected boolean removeAbandoned;
protected int removeAbandonedTimeout;
protected int removeAbandonedTimeoutMillis;
protected boolean logAbandoned;
@@ -263,11 +263,15 @@ public abstract class DruidAbstractDataSource implements DruidAbstractDataSource
}
public int getRemoveAbandonedTimeout() {
return removeAbandonedTimeout;
return removeAbandonedTimeoutMillis / 1000;
}
public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) {
this.removeAbandonedTimeout = removeAbandonedTimeout;
this.removeAbandonedTimeoutMillis = removeAbandonedTimeout * 1000;
}
public void setRemoveAbandonedTimeoutMillis(int removeAbandonedTimeoutMillis) {
this.removeAbandonedTimeoutMillis = removeAbandonedTimeoutMillis;
}
public boolean isRemoveAbandoned() {
@@ -21,7 +21,9 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -88,7 +90,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
public DruidDataSource(){
}
public void resetStat() {
lock.lock();
try {
@@ -313,6 +315,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
/**
* 抛弃连接,不进行回收,而是抛弃
*
* @param realConnection
* @throws SQLException
*/
@@ -412,6 +415,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
assert holder != null;
if (isRemoveAbandoned()) {
activeConnections.remove(pooledConnection);
}
try {
// 第一步,检查连接是否关闭
if (conn == null || conn.isClosed()) {
@@ -747,12 +754,26 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
break;
}
if (poolingCount <= 0) {
Thread.sleep(minEvictableIdleTimeMillis);
continue;
}
shrink(true);
if (isRemoveAbandoned()) {
Iterator<Map.Entry<PoolableConnection, ActiveConnectionTraceInfo>> iter = activeConnections.entrySet().iterator();
long currentMillis = 0;
for (; iter.hasNext();) {
if (currentMillis == 0) {
System.currentTimeMillis();
}
Map.Entry<PoolableConnection, ActiveConnectionTraceInfo> entry = iter.next();
ActiveConnectionTraceInfo activeInfo = entry.getValue();
long timeMillis = activeInfo.getConnectTime() - currentMillis;
if (timeMillis >= removeAbandonedTimeoutMillis) {
PoolableConnection pooledConnection = entry.getKey();
JdbcUtils.close(pooledConnection);
}
}
}
} catch (InterruptedException e) {
break;
}
@@ -0,0 +1,35 @@
package com.alibaba.druid.bvt.pool;
import java.sql.Connection;
import junit.framework.Assert;
import junit.framework.TestCase;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
public class TestAbondon extends TestCase {
private DruidDataSource dataSource;
protected void setUp() throws Exception {
dataSource = new DruidDataSource();
dataSource.setRemoveAbandoned(true);
dataSource.setRemoveAbandonedTimeoutMillis(10);
dataSource.setTimeBetweenEvictionRunsMillis(1);
dataSource.setUrl("jdbc:mock:xxx");
}
protected void tearDown() throws Exception {
dataSource.close();
Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
}
public void test_0() throws Exception {
Connection conn = dataSource.getConnection();
Assert.assertEquals(false, conn.isClosed());
Thread.sleep(100);
Assert.assertEquals(true, conn.isClosed());
}
}