From c4b2b4cf892df272a8b3e005c3187d0d8ecc678f Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 23 Dec 2011 22:51:54 +0800 Subject: [PATCH] ha --- .../pool/ha/balance/RoundRobinBlancer.java | 36 +++++++++++++------ .../druid/pool/ha/balance/WeightBalancer.java | 6 ++++ 2 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/pool/ha/balance/WeightBalancer.java 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 8bd70e262c..e298544293 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 @@ -1,8 +1,6 @@ package com.alibaba.druid.pool.ha.balance; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import com.alibaba.druid.logging.Log; @@ -23,7 +21,8 @@ public class RoundRobinBlancer implements Balancer { } @Override - public MultiConnectionHolder getConnection(MultiDataSourceConnection connectionProxy, String sql) throws SQLException { + public MultiConnectionHolder getConnection(MultiDataSourceConnection connectionProxy, String sql) + throws SQLException { MultiDataSource multiDataSource = connectionProxy.getHaDataSource(); int tryCount = 0; @@ -38,12 +37,30 @@ public class RoundRobinBlancer implements Balancer { int index = (int) (connectionId % size); + DataSourceHolder first = null; DataSourceHolder dataSource = null; try { - // 处理并发时的错误 - List dataSources = new ArrayList(multiDataSource.getDataSources().values()); - dataSource = dataSources.get(index); + int itemIndex = 0; + for (DataSourceHolder item : multiDataSource.getDataSources().values()) { + if (!item.isEnable()) { + continue; + } + + if (first == null) { + first = item; + } + + if (itemIndex == index) { + dataSource = item; + break; + } + itemIndex++; + } + + if (dataSource == null) { + dataSource = first; + } } catch (Exception ex) { indexErrorCount.incrementAndGet(); if (LOG.isDebugEnabled()) { @@ -52,11 +69,8 @@ public class RoundRobinBlancer implements Balancer { continue; } - assert dataSource != null; - - if (!dataSource.isEnable()) { - multiDataSource.handleNotAwailableDatasource(dataSource); - continue; + if (dataSource == null) { + throw new SQLException("can not get real connection."); } MultiConnectionHolder conn = null; diff --git a/src/main/java/com/alibaba/druid/pool/ha/balance/WeightBalancer.java b/src/main/java/com/alibaba/druid/pool/ha/balance/WeightBalancer.java new file mode 100644 index 0000000000..36eeeebfcc --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/ha/balance/WeightBalancer.java @@ -0,0 +1,6 @@ +package com.alibaba.druid.pool.ha.balance; + + +public class WeightBalancer { + +}