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) {