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 6c51ff9a58..958a9da9e9 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java @@ -2,6 +2,9 @@ package com.alibaba.druid.pool.ha; import java.sql.Connection; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; import javax.sql.DataSource; @@ -12,19 +15,34 @@ import com.alibaba.druid.pool.DruidDataSource; public class HADataSource extends MultiDataSource implements DataSource { - private final static Log LOG = LogFactory.getLog(HADataSource.class); + private final static Log LOG = LogFactory.getLog(HADataSource.class); - private AtomicInteger requestCount = new AtomicInteger(); + private AtomicInteger requestCount = new AtomicInteger(); + protected final List notAvailableDatasources = new CopyOnWriteArrayList(); + + public HADataSource() { + super(new ArrayList()); + } + @Override public Connection getConnection() throws SQLException { int tryCount = 0; + int requestNumber = requestCount.getAndIncrement(); + for (;;) { - int requestNumber = requestCount.getAndIncrement(); int size = dataSources.size(); int index = requestNumber % size; DruidDataSource dataSource = dataSources.get(index); + + if (!dataSource.isEnable()) { + boolean removed = dataSources.remove(dataSource); + if (removed) { + notAvailableDatasources.add(dataSource); + } + } + Connection conn = null; try { @@ -40,12 +58,6 @@ public class HADataSource extends MultiDataSource implements DataSource { continue; } - if (conn != null) { - if (!dataSource.isTestOnBorrow()) { - dataSource.testConnection(conn); - } - } - return conn; } } 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 f331391e16..43d8165064 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java @@ -12,10 +12,18 @@ import com.alibaba.druid.pool.DruidDataSource; public abstract class MultiDataSource implements DataSource { - protected final List dataSources = new CopyOnWriteArrayList(); + protected final List dataSources; private int loginTimeout = 0; private PrintWriter logWriter = new PrintWriter(System.out); + + public MultiDataSource() { + dataSources = new CopyOnWriteArrayList(); + } + + public MultiDataSource(List dataSources) { + this.dataSources = dataSources; + } public List getDataSources() { return dataSources;