diff --git a/src/main/java/com/alibaba/druid/pool/ha/DataSourceHolder.java b/src/main/java/com/alibaba/druid/pool/ha/DataSourceHolder.java index 3f59f0b8e0..e3ef2e3bfa 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/DataSourceHolder.java +++ b/src/main/java/com/alibaba/druid/pool/ha/DataSourceHolder.java @@ -9,10 +9,12 @@ import com.alibaba.druid.pool.DruidDataSource; public class DataSourceHolder implements Closeable { - private final DruidDataSource dataSource; - private boolean enable = true; - private final AtomicLong connectCount = new AtomicLong(); - private final AtomicLong connectErrorCount = new AtomicLong(); + private final DruidDataSource dataSource; + private boolean enable = true; + private final AtomicLong connectCount = new AtomicLong(); + private final AtomicLong connectErrorCount = new AtomicLong(); + + private boolean fail = false; public DataSourceHolder(DruidDataSource dataSource){ if (dataSource == null) { @@ -26,13 +28,21 @@ public class DataSourceHolder implements Closeable { } public boolean isEnable() { - return enable; + return enable && (!fail); } public void setEnable(boolean enable) { this.enable = enable; } + public boolean isFail() { + return fail; + } + + public void setFail(boolean fail) { + this.fail = fail; + } + public DruidDataSource getDataSource() { return dataSource; } @@ -66,7 +76,7 @@ public class DataSourceHolder implements Closeable { public void close() { dataSource.close(); } - + public void restart() { dataSource.restart(); } 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 42640f7749..75da0110e2 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HADataSource.java @@ -78,6 +78,22 @@ public class HADataSource extends MultiDataSource implements HADataSourceMBean, return master.isEnable(); } + + public boolean isMasterFail() { + if (master == null) { + return false; + } + + return master.isFail(); + } + + public boolean isSlaveFail() { + if (slave == null) { + return false; + } + + return slave.isFail(); + } public void setMasterEnable(boolean value) { if (master == null) { diff --git a/src/main/java/com/alibaba/druid/pool/ha/HADataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/ha/HADataSourceMBean.java index 8ba92a6eda..815fd407c7 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HADataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HADataSourceMBean.java @@ -24,4 +24,8 @@ public interface HADataSourceMBean extends MultiDataSourceMBean { void restartMaster(); void restartSlave(); + + boolean isMasterFail(); + + boolean isSlaveFail(); } 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 1c917f74f7..d87f125243 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSource.java @@ -129,9 +129,9 @@ public abstract class MultiDataSource extends DataSourceAdapter implements Multi for (DataSourceHolder dataSourceHolder : getDataSources().values()) { boolean isValid = validDataSourceChecker.isValid(dataSourceHolder.getDataSource()); if (!isValid) { - dataSourceHolder.setEnable(false); + dataSourceHolder.setFail(true); } else { - dataSourceHolder.setEnable(true); + dataSourceHolder.setFail(false); } } }