diff --git a/src/main/java/com/alibaba/druid/pool/ha/HighAvailableDataSource.java b/src/main/java/com/alibaba/druid/pool/ha/HighAvailableDataSource.java index e6e45879d8..899c4a1350 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/HighAvailableDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/ha/HighAvailableDataSource.java @@ -167,11 +167,9 @@ public class HighAvailableDataSource extends WrapperAdapter implements DataSourc } public void setSelector(String name) { - if (name != null && this.selector != null && this.selector.isSame(name)) { - return; - } DataSourceSelector selector = DataSourceSelectorFactory.getSelector(name, this); if (selector != null) { + selector.init(); setDataSourceSelector(selector); } } diff --git a/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelector.java b/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelector.java index 5db261fa33..301ab7e654 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelector.java +++ b/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelector.java @@ -27,7 +27,6 @@ import java.util.Map; public interface DataSourceSelector { DataSource get(); void setTarget(String name); - boolean isSame(String name); String getName(); void init(); } diff --git a/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelectorEnum.java b/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelectorEnum.java new file mode 100644 index 0000000000..6337716629 --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelectorEnum.java @@ -0,0 +1,53 @@ +package com.alibaba.druid.pool.ha.selector; + +import com.alibaba.druid.pool.ha.HighAvailableDataSource; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; + +/** + * An enum holding the names and classes of DataSourceSelector. + * + * @author DigitalSonic + */ +public enum DataSourceSelectorEnum { + BY_NAME("byName", NamedDataSourceSelector.class), + RANDOM("random", RandomDataSourceSelector.class), + STICKY_RANDOM("stickyRandom", StickyRandomDataSourceSelector.class); + + private final static Log LOG = LogFactory.getLog(DataSourceSelectorEnum.class); + private String name; + private Class clazz; + + DataSourceSelectorEnum(String name, Class clazz) { + this.name = name; + this.clazz = clazz; + } + + /** + * Create a new instance of the DataSourceSelector represented by this enum. + * + * @return null if dataSource is not given or exception occurred while creating new instance + */ + public DataSourceSelector newInstance(HighAvailableDataSource dataSource) { + if (dataSource == null) { + LOG.warn("You should provide an instance of HighAvailableDataSource!"); + return null; + } + + DataSourceSelector selector = null; + try { + selector = clazz.getDeclaredConstructor(HighAvailableDataSource.class).newInstance(dataSource); + } catch (Exception e) { + LOG.error("Can not create new instance of " + clazz.getName(), e); + } + return selector; + } + + public String getName() { + return name; + } + + public Class getClazz() { + return clazz; + } +} diff --git a/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelectorFactory.java b/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelectorFactory.java index 5ba620400e..4054ab6920 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelectorFactory.java +++ b/src/main/java/com/alibaba/druid/pool/ha/selector/DataSourceSelectorFactory.java @@ -23,11 +23,16 @@ import com.alibaba.druid.pool.ha.HighAvailableDataSource; * @author DigitalSonic */ public class DataSourceSelectorFactory { + /** + * Get a new instance of the given selector name. + * + * @return null if the given name do not represent a DataSourceSelector + */ public static DataSourceSelector getSelector(String name, HighAvailableDataSource highAvailableDataSource) { - if ("random".equalsIgnoreCase(name)) { - return new RandomDataSourceSelector(highAvailableDataSource); - } else if ("byName".equalsIgnoreCase(name)) { - return new NamedDataSourceSelector(highAvailableDataSource); + for (DataSourceSelectorEnum e : DataSourceSelectorEnum.values()) { + if (e.getName().equalsIgnoreCase(name)) { + return e.newInstance(highAvailableDataSource); + } } return null; } diff --git a/src/main/java/com/alibaba/druid/pool/ha/selector/NamedDataSourceSelector.java b/src/main/java/com/alibaba/druid/pool/ha/selector/NamedDataSourceSelector.java index 515468ca8b..1ce27a2144 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/selector/NamedDataSourceSelector.java +++ b/src/main/java/com/alibaba/druid/pool/ha/selector/NamedDataSourceSelector.java @@ -39,14 +39,9 @@ public class NamedDataSourceSelector implements DataSourceSelector { public void init() { } - @Override - public boolean isSame(String name) { - return getName().equalsIgnoreCase(name); - } - @Override public String getName() { - return "byName"; + return DataSourceSelectorEnum.BY_NAME.getName(); } @Override diff --git a/src/main/java/com/alibaba/druid/pool/ha/selector/RandomDataSourceSelector.java b/src/main/java/com/alibaba/druid/pool/ha/selector/RandomDataSourceSelector.java index 8a0a13a0f4..faa520f905 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/selector/RandomDataSourceSelector.java +++ b/src/main/java/com/alibaba/druid/pool/ha/selector/RandomDataSourceSelector.java @@ -74,14 +74,9 @@ public class RandomDataSourceSelector implements DataSourceSelector { } } - @Override - public boolean isSame(String name) { - return getName().equalsIgnoreCase(name); - } - @Override public String getName() { - return "random"; + return DataSourceSelectorEnum.RANDOM.getName(); } @Override diff --git a/src/main/java/com/alibaba/druid/pool/ha/selector/StickyRandomDataSourceSelector.java b/src/main/java/com/alibaba/druid/pool/ha/selector/StickyRandomDataSourceSelector.java index ccc4153e40..b4ebf7de55 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/selector/StickyRandomDataSourceSelector.java +++ b/src/main/java/com/alibaba/druid/pool/ha/selector/StickyRandomDataSourceSelector.java @@ -25,6 +25,11 @@ public class StickyRandomDataSourceSelector extends RandomDataSourceSelector { super(highAvailableDataSource); } + @Override + public String getName() { + return DataSourceSelectorEnum.STICKY_RANDOM.getName(); + } + @Override public DataSource get() { StickyDataSourceHolder holder = holders.get();