From 2d7c9e6c4ae07d1e4c0837008539ac74af31a22d Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 21 Dec 2011 22:20:14 +0800 Subject: [PATCH] ha --- .../com/alibaba/druid/pool/ha/MultiDataSource.java | 12 ++++++++---- .../druid/pool/ha/MultiDataSourceConnection.java | 2 ++ .../alibaba/druid/pool/ha/MultiDataSourceMBean.java | 6 ++++++ .../druid/bvt/pool/ha/MultiDataSourceTest.java | 12 ++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/ha/MultiDataSourceTest.java 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 e98f006d26..2425ab9906 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java @@ -31,7 +31,7 @@ import com.alibaba.druid.pool.ha.valid.DefaultDataSourceFailureDetecter; import com.alibaba.druid.proxy.jdbc.DataSourceProxy; import com.alibaba.druid.util.JdbcUtils; -public abstract class MultiDataSource extends DataSourceAdapter implements MultiDataSourceMBean, DataSourceProxy { +public class MultiDataSource extends DataSourceAdapter implements MultiDataSourceMBean, DataSourceProxy { private final static Log LOG = LogFactory.getLog(MultiDataSource.class); @@ -78,7 +78,7 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi private Random random; - private int maxPoolSize; + private int maxPoolSize = 50; private long activeCount = 0; @@ -319,7 +319,7 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi if (activeCount >= maxPoolSize) { notFull.await(); } - + MultiDataSourceConnection conn = new MultiDataSourceConnection(this, createConnectionId()); activeCount++; @@ -341,6 +341,10 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi lock.unlock(); } } + + public int produceRandomNumber() { + return random.nextInt(totalWeight); + } public MultiConnectionHolder getConnectionInternal(MultiDataSourceConnection multiConn, String sql) throws SQLException { @@ -349,7 +353,7 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi final int MAX_RETRY = 10; for (int i = 0; i < MAX_RETRY; ++i) { - int randomNumber = random.nextInt(totalWeight); + int randomNumber = produceRandomNumber(); DataSourceHolder first = null; boolean needRetry = false; 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 daf7455c05..c6b25438f9 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java @@ -151,6 +151,8 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect conn.close(); } this.closed = true; + + haDataSource.afterConnectionClosed(this); } @Override diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceMBean.java index 0e99921f01..792f9590c4 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceMBean.java @@ -29,4 +29,10 @@ public interface MultiDataSourceMBean { long getFailureDetectPeriodMillis(); long getConfigLoadPeriodMillis(); + + long getActiveCount(); + + int getMaxPoolSize(); + + int produceRandomNumber(); } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/ha/MultiDataSourceTest.java b/src/test/java/com/alibaba/druid/bvt/pool/ha/MultiDataSourceTest.java new file mode 100644 index 0000000000..2d3e64448a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/ha/MultiDataSourceTest.java @@ -0,0 +1,12 @@ +package com.alibaba.druid.bvt.pool.ha; + +import junit.framework.TestCase; + +import com.alibaba.druid.pool.ha.MultiDataSource; + + +public class MultiDataSourceTest extends TestCase { + public void test_0 () throws Exception { + MultiDataSource multiDataSource = new MultiDataSource(); + } +}