From 81a9557fa2e22450a9c25ae390c70df8adee5779 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 16 Sep 2011 10:22:06 +0000 Subject: [PATCH] HAPoolTest git-svn-id: http://code.alibabatech.com/svn/druid/trunk@816 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../alibaba/druid/pool/DruidDataSource.java | 4 ++ .../alibaba/druid/pool/ha/HADataSource.java | 29 +++++++++++- .../pool/ha/balance/RoundRobinBlancer.java | 2 +- .../bvt/pool/basic/TestDataSourceBasic.java | 5 +++ .../druid/bvt/pool/ha/HADataSourceTest.java | 45 +++++++++++++++++++ 5 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 4763c99daf..bb61384ad9 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -149,6 +149,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat lock.unlock(); } } + + public boolean isInited() { + return this.inited; + } private void init() throws SQLException { if (inited) { diff --git a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java index bb3f9c9b35..0d6bad2e2e 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java @@ -9,12 +9,16 @@ import java.util.concurrent.CopyOnWriteArrayList; import javax.sql.DataSource; +import com.alibaba.druid.logging.Log; +import com.alibaba.druid.logging.LogFactory; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.ha.balance.Balancer; import com.alibaba.druid.pool.ha.balance.RoundRobinBlancer; public class HADataSource extends MultiDataSource implements DataSource { + private final static Log LOG = LogFactory.getLog(HADataSource.class); + protected ArrayList dataSources = new ArrayList(); protected final List notAvailableDatasources = new CopyOnWriteArrayList(); @@ -28,9 +32,15 @@ public class HADataSource extends MultiDataSource implements DataSource { return Collections.unmodifiableList(dataSources); } - public void setDataSources(List dataSources) { + public synchronized void setDataSources(List dataSources) { this.dataSources = new ArrayList(dataSources); } + + public synchronized void addDataSource(DruidDataSource dataSource) { + ArrayList newList = new ArrayList(dataSources); + newList.add(dataSource); + this.dataSources = newList; + } @Override public Connection getConnection() throws SQLException { @@ -56,4 +66,21 @@ public class HADataSource extends MultiDataSource implements DataSource { } } + public void close() { + for (DruidDataSource item : dataSources) { + try { + item.close(); + } catch (Exception ex) { + LOG.error("close dataSource error", ex); + } + } + for (DruidDataSource item : notAvailableDatasources) { + try { + item.close(); + } catch (Exception ex) { + LOG.error("close dataSource error", ex); + } + } + } + } diff --git a/src/main/java/com/alibaba/druid/pool/ha/balance/RoundRobinBlancer.java b/src/main/java/com/alibaba/druid/pool/ha/balance/RoundRobinBlancer.java index 4735ff5111..7522300184 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/balance/RoundRobinBlancer.java +++ b/src/main/java/com/alibaba/druid/pool/ha/balance/RoundRobinBlancer.java @@ -51,7 +51,7 @@ public class RoundRobinBlancer implements Balancer { assert dataSource != null; - if (!dataSource.isEnable()) { + if (dataSource.isInited() && !dataSource.isEnable()) { multiDataSource.handleNotAwailableDatasource(dataSource); continue; } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic.java index f2f3120663..eda362595e 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic.java @@ -92,6 +92,11 @@ public class TestDataSourceBasic extends TestCase { public void test_wrap() throws Exception { Assert.assertTrue(!dataSource.isWrapperFor(Date.class)); + Assert.assertTrue(!dataSource.isWrapperFor(null)); Assert.assertTrue(dataSource.isWrapperFor(DataSource.class)); + + Assert.assertTrue(dataSource.unwrap(Date.class) == null); + Assert.assertTrue(dataSource.unwrap(null) == null); + Assert.assertTrue(dataSource.unwrap(DataSource.class) != null); } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java b/src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java new file mode 100644 index 0000000000..4184784509 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/ha/HADataSourceTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.pool.ha; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; + +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.ha.HADataSource; + + +public class HADataSourceTest extends TestCase { + private DruidDataSource dataSourceA; + private DruidDataSource dataSourceB; + + private HADataSource dataSourceHA; + + protected void setUp() throws Exception { + dataSourceA = new DruidDataSource(); + dataSourceA.setUrl("jdbc:mock:x1"); + + dataSourceB = new DruidDataSource(); + dataSourceB.setUrl("jdbc:mock:x1"); + + dataSourceHA = new HADataSource(); + dataSourceHA.addDataSource(dataSourceA); + dataSourceHA.addDataSource(dataSourceB); + } + + protected void tearDown() throws Exception { + dataSourceHA.close(); + } + + public void test_connect_close() throws Exception { + Connection conn = dataSourceHA.getConnection(); + + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT 1"); + rs.close(); + stmt.close(); + + conn.close(); + } +}