From f9fabd8801bc603086f0ef0118b529d63fa73133 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 17 Jul 2011 09:40:41 +0000 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81HA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@466 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../com/alibaba/druid/pool/ha/HADataSource.java | 16 ++++++++++++---- .../alibaba/druid/pool/ha/MultiDataSource.java | 2 +- .../druid/pool/ha/MultiDataSourceConnection.java | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) 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 dad8dc8feb..0e91da9b85 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java @@ -20,11 +20,11 @@ public class HADataSource extends MultiDataSource implements DataSource { private final AtomicInteger indexErrorCount = new AtomicInteger(); - protected ArrayList dataSources; + protected ArrayList dataSources = new ArrayList(); protected final List notAvailableDatasources = new CopyOnWriteArrayList(); public HADataSource(){ - dataSources = new ArrayList(); + } public List getDataSources() { @@ -40,7 +40,15 @@ public class HADataSource extends MultiDataSource implements DataSource { return new MultiDataSourceConnection(this, createConnectionId()); } - public Connection getConnectionInternal(int connectionId, String sql) throws SQLException { + protected int indexFor(MultiDataSourceConnection multiDataSourceConnection, String sql) { + int size = dataSources.size(); + int connectionId = (int) multiDataSourceConnection.getId(); + + return connectionId % size; + } + + public Connection getConnectionInternal(MultiDataSourceConnection multiDataSourceConnection, String sql) throws SQLException { + int tryCount = 0; for (;;) { @@ -50,7 +58,7 @@ public class HADataSource extends MultiDataSource implements DataSource { throw new SQLException("can not get connection, no availabe datasources"); } - int index = connectionId % size; + int index = indexFor(multiDataSourceConnection, sql); DruidDataSource dataSource = null; 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 aeaa06f65f..ce4a69b79f 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java @@ -40,5 +40,5 @@ public abstract class MultiDataSource extends DataSourceAdapter { @Override public abstract Connection getConnection() throws SQLException; - public abstract Connection getConnectionInternal(int connectionId, String sql) throws SQLException; + public abstract Connection getConnectionInternal(MultiDataSourceConnection conn, String sql) throws SQLException; } 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 bccf760731..e6ea3bc8d1 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourceConnection.java @@ -54,7 +54,7 @@ public class MultiDataSourceConnection extends WrapperAdapter implements Connect public void checkConnection(String sql) throws SQLException { if (conn == null) { - conn = haDataSource.getConnectionInternal(id, sql); + conn = haDataSource.getConnectionInternal(this, sql); } if (autoCommit != null) {