From 86902b616618c4d7b290049acbe61d38f826bba1 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 21 Dec 2011 21:26:19 +0800 Subject: [PATCH] ha --- .../druid/pool/ha/MultiDataSource.java | 49 ++++++++++++++++++- .../pool/ha/MultiDataSourceConnection.java | 11 ++--- .../druid/pool/ha/cobar/CobarDataSource.java | 20 ++++---- 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java index 18b9c74ece..e98f006d26 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java @@ -15,6 +15,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -59,6 +60,7 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi private boolean inited = false; protected final Lock lock = new ReentrantLock(); + protected final Condition notFull = lock.newCondition(); private ConcurrentMap dataSources = new ConcurrentHashMap(); @@ -76,6 +78,22 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi private Random random; + private int maxPoolSize; + + private long activeCount = 0; + + public int getMaxPoolSize() { + return maxPoolSize; + } + + public void setMaxPoolSize(int maxPoolSize) throws SQLException { + if (this.isIntited()) { + throw new SQLException("dataSource inited"); + } + + this.maxPoolSize = maxPoolSize; + } + public ConfigLoader getConfigLoader() { return configLoader; } @@ -274,6 +292,10 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi return properties; } + public long getActiveCount() { + return activeCount; + } + public void computeTotalWeight() { int totalWeight = 0; for (DataSourceHolder holder : this.dataSources.values()) { @@ -292,7 +314,32 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi public Connection getConnection() throws SQLException { init(); - return new MultiDataSourceConnection(this, createConnectionId()); + lock.lock(); + try { + if (activeCount >= maxPoolSize) { + notFull.await(); + } + + MultiDataSourceConnection conn = new MultiDataSourceConnection(this, createConnectionId()); + + activeCount++; + + return conn; + } catch (InterruptedException e) { + throw new SQLException("thread interrupted", e); + } finally { + lock.unlock(); + } + } + + protected void afterConnectionClosed(MultiDataSourceConnection conn) { + lock.lock(); + try { + activeCount--; + notFull.signal(); + } finally { + lock.unlock(); + } } public MultiConnectionHolder getConnectionInternal(MultiDataSourceConnection multiConn, String sql) diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java index 08895c67bf..daf7455c05 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java @@ -49,11 +49,13 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect private Date connectedTime = null; + private boolean closed = false; + public MultiDataSourceConnection(MultiDataSource haDataSource, long id){ this.haDataSource = haDataSource; this.id = id; } - + public DataSourceHolder getDataSourceHolder() { return dataSourceHolder; } @@ -148,15 +150,12 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect if (conn != null) { conn.close(); } + this.closed = true; } @Override public boolean isClosed() throws SQLException { - if (conn != null) { - return conn.isClosed(); - } - - return false; + return closed; } @Override diff --git a/src/main/java/com/alibaba/druid/pool/ha/cobar/CobarDataSource.java b/src/main/java/com/alibaba/druid/pool/ha/cobar/CobarDataSource.java index 1c0dd0d846..d498bbe452 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/cobar/CobarDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/cobar/CobarDataSource.java @@ -27,27 +27,24 @@ public class CobarDataSource extends MultiDataSource { private String password; + private long minEvictableIdleTimeMillis = 1000 * 60 * 3; // 3 + // minutes + private List proxyFilters = new ArrayList(); private String filters; - private int maxPoolSize; - public CobarDataSource(){ this.setFailureDetector(new CobarFailureDetecter()); this.setFailureDetectPeriodMillis(DEFAULT_FAILURE_DETECT_PERRIOD_MILLIS); this.setConfigLoadPeriodMillis(DEFAULT_CONFIG_LOAD_PERRIOD_MILLIS); } - public int getMaxPoolSize() { - return maxPoolSize; + public long getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; } - public void setMaxPoolSize(int maxPoolSize) throws SQLException { - if (this.isIntited()) { - throw new SQLException("dataSource inited"); - } - - this.maxPoolSize = maxPoolSize; + public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } public String getUrl() { @@ -124,6 +121,9 @@ public class CobarDataSource extends MultiDataSource { dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); + dataSource.setMaxActive(getMaxPoolSize()); + dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); // 3 minutes + if (filters != null && !filters.isEmpty()) { dataSource.setFilters(filters); }