This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 20fbf141f70 Move checker to build rules and add load balance check 
(#19546)
20fbf141f70 is described below

commit 20fbf141f7057f593af7742878c562f3e7273991
Author: zhaojinchao <[email protected]>
AuthorDate: Tue Jul 26 17:33:12 2022 +0800

    Move checker to build rules and add load balance check (#19546)
    
    * Move checker to build rules and add load balance check
    
    * Add unit test
    
    * Fix ci
    
    * Fix ci
    
    * Remove sharding table and auto table check
    
    * Remove unless check
---
 .../DatabaseDiscoveryRuleConfigurationChecker.java |  7 ++-
 ...abaseDiscoveryRuleConfigurationCheckerTest.java |  4 +-
 .../AbstractEncryptRuleConfigurationChecker.java   |  5 +-
 ...rovidedEncryptRuleConfigurationCheckerTest.java |  6 +-
 .../EncryptRuleConfigurationCheckerTest.java       |  6 +-
 ...ReadwriteSplittingRuleConfigurationChecker.java | 68 ++++++++++++++++++++--
 ...ReadwriteSplittingRuleConfigurationChecker.java |  7 +++
 ...ReadwriteSplittingRuleConfigurationChecker.java | 11 ++++
 .../rule/ReadwriteSplittingDataSourceRule.java     |  3 -
 .../rule/ReadwriteSplittingRule.java               | 11 +---
 .../ReadwriteSplittingStrategyFactory.java         |  5 --
 ...writeSplittingRuleConfigurationCheckerTest.java | 14 +++--
 ...writeSplittingRuleConfigurationCheckerTest.java | 44 ++++++++++++--
 .../rule/ReadwriteSplittingDataSourceRuleTest.java | 22 -------
 .../rule/ReadwriteSplittingRuleTest.java           |  5 --
 .../AbstractShadowRuleConfigurationChecker.java    |  4 +-
 ...ProvidedShadowRuleConfigurationCheckerTest.java |  4 +-
 .../ShadowRuleConfigurationCheckerTest.java        |  3 +-
 .../AbstractShardingRuleConfigurationChecker.java  |  7 ++-
 ...ovidedShardingRuleConfigurationCheckerTest.java | 16 +----
 .../ShardingRuleConfigurationCheckerTest.java      | 10 +---
 ...orithmProviderConfigurationYamlSwapperTest.java |  1 -
 .../config/checker/RuleConfigurationChecker.java   |  9 ++-
 .../builder/database/DatabaseRulesBuilder.java     |  2 +
 .../checker/RuleConfigurationCheckerFixture.java   |  7 ++-
 .../core/datasource/ShardingSphereDataSource.java  |  7 ---
 .../spring/boot/SpringBootStarterTest.java         |  4 +-
 .../src/test/resources/application.properties      |  2 +-
 .../proxy/initializer/BootstrapInitializer.java    | 11 ----
 .../fixture/RuleConfigurationFixtureChecker.java   |  8 ++-
 .../fixture/TestRuleConfigurationChecker.java      |  7 ++-
 31 files changed, 194 insertions(+), 126 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationChecker.java
index 220b747fb0f..9a8e533981e 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationChecker.java
@@ -21,6 +21,11 @@ import com.google.common.base.Preconditions;
 import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
 import org.apache.shardingsphere.dbdiscovery.constant.DatabaseDiscoveryOrder;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+
+import javax.sql.DataSource;
+import java.util.Collection;
+import java.util.Map;
 
 /**
  * Database discovery rule configuration checker.
@@ -28,7 +33,7 @@ import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
 public final class DatabaseDiscoveryRuleConfigurationChecker implements 
RuleConfigurationChecker<DatabaseDiscoveryRuleConfiguration> {
     
     @Override
-    public void check(final String databaseName, final 
DatabaseDiscoveryRuleConfiguration config) {
+    public void check(final String databaseName, final 
DatabaseDiscoveryRuleConfiguration config, final Map<String, DataSource> 
dataSourceMap, final Collection<ShardingSphereRule> rules) {
         config.getDataSources().forEach(each -> 
Preconditions.checkState(!each.getDiscoveryTypeName().isEmpty(), "No available 
database discovery rule configuration in database `%s.", databaseName));
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationCheckerTest.java
index 5668c8ad754..c6f2ffb9b23 100644
--- 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/checker/DatabaseDiscoveryRuleConfigurationCheckerTest.java
@@ -41,7 +41,7 @@ public final class 
DatabaseDiscoveryRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(DatabaseDiscoveryRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private DatabaseDiscoveryRuleConfiguration getValidConfiguration() {
@@ -59,7 +59,7 @@ public final class 
DatabaseDiscoveryRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(DatabaseDiscoveryRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private DatabaseDiscoveryRuleConfiguration getInvalidConfiguration() {
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
index 076914023f3..2d802f94705 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
@@ -23,8 +23,11 @@ import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfig
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
+import javax.sql.DataSource;
 import java.util.Collection;
+import java.util.Map;
 
 /**
  * Abstract encrypt rule configuration checker.
@@ -34,7 +37,7 @@ import java.util.Collection;
 public abstract class AbstractEncryptRuleConfigurationChecker<T extends 
RuleConfiguration> implements RuleConfigurationChecker<T> {
     
     @Override
-    public final void check(final String databaseName, final T config) {
+    public final void check(final String databaseName, final T config, final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
rules) {
         checkTableConfiguration(databaseName, getTables(config), 
getEncryptors(config));
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
index 3440d21c59e..a1cc2beeb58 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
@@ -44,7 +44,7 @@ public final class 
AlgorithmProvidedEncryptRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedEncryptRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     @SuppressWarnings("unchecked")
@@ -63,7 +63,7 @@ public final class 
AlgorithmProvidedEncryptRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedEncryptRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private AlgorithmProvidedEncryptRuleConfiguration 
createInvalidCipherColumnConfig() {
@@ -81,7 +81,7 @@ public final class 
AlgorithmProvidedEncryptRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedEncryptRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private AlgorithmProvidedEncryptRuleConfiguration 
createInvalidAssistColumnConfig() {
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
index 306b652542d..2008743039b 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
@@ -44,7 +44,7 @@ public final class EncryptRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(EncryptRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private EncryptRuleConfiguration createValidConfiguration() {
@@ -62,7 +62,7 @@ public final class EncryptRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(EncryptRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private EncryptRuleConfiguration createInvalidCipherColumnConfig() {
@@ -80,7 +80,7 @@ public final class EncryptRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(EncryptRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private EncryptRuleConfiguration createInvalidAssistColumnConfig() {
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
index 32a77180269..1776658987c 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
@@ -18,14 +18,25 @@
 package org.apache.shardingsphere.readwritesplitting.checker;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
+import 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionWeightReadQueryLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.WeightReadQueryLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import 
org.apache.shardingsphere.readwritesplitting.api.strategy.DynamicReadwriteSplittingStrategyConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.strategy.StaticReadwriteSplittingStrategyConfiguration;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
+import javax.sql.DataSource;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Optional;
+import java.util.Map;
+import java.util.List;
 
 /**
  * Abstract readwrite-splitting rule configuration checker.
@@ -35,27 +46,72 @@ import java.util.Optional;
 public abstract class AbstractReadwriteSplittingRuleConfigurationChecker<T 
extends RuleConfiguration> implements RuleConfigurationChecker<T> {
     
     @Override
-    public final void check(final String databaseName, final T config) {
-        checkDataSources(databaseName, getDataSources(config));
+    public final void check(final String databaseName, final T config, final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
rules) {
+        Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs = 
getDataSources(config);
+        Preconditions.checkArgument(!configs.isEmpty(), "Replica query data 
source rules can not be empty.");
+        checkDataSources(databaseName, configs, dataSourceMap, rules);
+        checkLoadBalancerDataSourceName(databaseName, configs, 
getLoadBalancer(config), rules);
     }
     
-    private void checkDataSources(final String databaseName, final 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> dataSources) {
+    private void checkDataSources(final String databaseName, final 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs,
+                                  final Map<String, DataSource> dataSourceMap, 
final Collection<ShardingSphereRule> rules) {
         Collection<String> writeDataSourceNames = new HashSet<>();
         Collection<String> readDataSourceNames = new HashSet<>();
-        for (ReadwriteSplittingDataSourceRuleConfiguration each : dataSources) 
{
+        for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
+            
Preconditions.checkArgument(!Strings.isNullOrEmpty(each.getName()), "Name is 
required.");
             Preconditions.checkState(null != each.getStaticStrategy() || null 
!= each.getDynamicStrategy(),
                     "No available readwrite-splitting rule configuration in 
database `%s`.", databaseName);
-            Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional 
-> checkStaticStrategy(databaseName, writeDataSourceNames, readDataSourceNames, 
optional));
+            Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional 
-> checkStaticStrategy(databaseName, dataSourceMap, writeDataSourceNames, 
readDataSourceNames, optional));
+            Optional.ofNullable(each.getDynamicStrategy()).ifPresent(optional 
-> checkDynamicStrategy(rules, optional));
         }
     }
     
-    private void checkStaticStrategy(final String databaseName, final 
Collection<String> writeDataSourceNames,
+    private void checkStaticStrategy(final String databaseName, final 
Map<String, DataSource> dataSourceMap, final Collection<String> 
writeDataSourceNames,
                                      final Collection<String> 
readDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration 
strategyConfig) {
+        
Preconditions.checkArgument(!Strings.isNullOrEmpty(strategyConfig.getWriteDataSourceName()),
 "Write data source name is required.");
+        
Preconditions.checkArgument(!strategyConfig.getReadDataSourceNames().isEmpty(), 
"Read data source names are required.");
+        strategyConfig.getReadDataSourceNames().forEach(each -> 
Preconditions.checkState(null != dataSourceMap.get(each), "Read data source 
name `%s` not in database `%s`.", each, databaseName));
         
Preconditions.checkState(writeDataSourceNames.add(strategyConfig.getWriteDataSourceName()),
                 "Can not config duplicate write dataSource `%s` in database 
`%s`.", strategyConfig.getWriteDataSourceName(), databaseName);
         
Preconditions.checkState(readDataSourceNames.addAll(strategyConfig.getReadDataSourceNames()),
                 "Can not config duplicate read dataSources `%s` in database 
`%s`.", strategyConfig.getReadDataSourceNames(), databaseName);
     }
     
+    private void checkDynamicStrategy(final Collection<ShardingSphereRule> 
rules, final DynamicReadwriteSplittingStrategyConfiguration dynamicStrategy) {
+        
Preconditions.checkArgument(!Strings.isNullOrEmpty(dynamicStrategy.getAutoAwareDataSourceName()),
 "Auto aware data source name is required.");
+        Optional<ShardingSphereRule> dynamicDataSourceStrategy = 
rules.stream().filter(each -> each instanceof 
DynamicDataSourceContainedRule).findFirst();
+        Preconditions.checkArgument(dynamicDataSourceStrategy.isPresent(), 
"Dynamic data source strategy is required.");
+    }
+    
+    private void checkLoadBalancerDataSourceName(final String databaseName, 
final Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs,
+                                                 final Map<String, 
ReadQueryLoadBalanceAlgorithm> loadBalancers, final 
Collection<ShardingSphereRule> rules) {
+        for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
+            if (Strings.isNullOrEmpty(each.getLoadBalancerName())) {
+                continue;
+            }
+            ReadQueryLoadBalanceAlgorithm loadBalancer = 
loadBalancers.get(each.getLoadBalancerName());
+            Preconditions.checkState(null != loadBalancer, "Not found load 
balance type in database `%s`.", databaseName);
+            if (loadBalancer instanceof WeightReadQueryLoadBalanceAlgorithm || 
loadBalancer instanceof TransactionWeightReadQueryLoadBalanceAlgorithm) {
+                Preconditions.checkState(!loadBalancer.getProps().isEmpty(), 
"Readwrite-splitting data source weight config are required in database `%s`.", 
databaseName);
+                List<String> dataSourceNames = getDataSourceNames(each, rules);
+                loadBalancer.getProps().keySet().forEach(dataSourceName -> 
Preconditions.checkState(dataSourceNames.contains(dataSourceName),
+                        "Load Balancer datasource name config does not match 
datasource in database `%s`.", databaseName));
+            }
+        }
+    }
+    
+    private List<String> getDataSourceNames(final 
ReadwriteSplittingDataSourceRuleConfiguration config, final 
Collection<ShardingSphereRule> rules) {
+        if (null != config.getStaticStrategy()) {
+            return config.getStaticStrategy().getReadDataSourceNames();
+        }
+        Optional<ShardingSphereRule> dynamicDataSourceStrategy = 
rules.stream().filter(each -> each instanceof 
DynamicDataSourceContainedRule).findFirst();
+        DynamicDataSourceContainedRule dynamicDataSourceRule = 
(DynamicDataSourceContainedRule) dynamicDataSourceStrategy.get();
+        List<String> result = new 
ArrayList<>(dynamicDataSourceRule.getReplicaDataSourceNames(config.getDynamicStrategy().getAutoAwareDataSourceName()));
+        
result.add(dynamicDataSourceRule.getPrimaryDataSourceName(config.getDynamicStrategy().getAutoAwareDataSourceName()));
+        return result;
+    }
+    
     protected abstract 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> getDataSources(T 
config);
+    
+    protected abstract Map<String, ReadQueryLoadBalanceAlgorithm> 
getLoadBalancer(T config);
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.java
index 9dcf467cb2e..7febd81903c 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.java
@@ -20,8 +20,10 @@ package org.apache.shardingsphere.readwritesplitting.checker;
 import 
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmProvidedReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
 import java.util.Collection;
+import java.util.Map;
 
 /**
  * Algorithm provided readwrite-splitting ruleConfiguration checker.
@@ -33,6 +35,11 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker e
         return config.getDataSources();
     }
     
+    @Override
+    protected Map<String, ReadQueryLoadBalanceAlgorithm> getLoadBalancer(final 
AlgorithmProvidedReadwriteSplittingRuleConfiguration config) {
+        return config.getLoadBalanceAlgorithms();
+    }
+    
     @Override
     public int getOrder() {
         return ReadwriteSplittingOrder.ALGORITHM_PROVIDER_ORDER;
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
index 330fc72f61a..0481352e4e2 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
@@ -20,8 +20,12 @@ package org.apache.shardingsphere.readwritesplitting.checker;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
+import 
org.apache.shardingsphere.readwritesplitting.factory.ReadQueryLoadBalanceAlgorithmFactory;
+import 
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
 
 import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 /**
  * Readwrite-splitting rule configuration checker.
@@ -33,6 +37,13 @@ public final class 
ReadwriteSplittingRuleConfigurationChecker extends AbstractRe
         return config.getDataSources();
     }
     
+    @Override
+    protected Map<String, ReadQueryLoadBalanceAlgorithm> getLoadBalancer(final 
ReadwriteSplittingRuleConfiguration config) {
+        Map<String, ReadQueryLoadBalanceAlgorithm> result = new 
LinkedHashMap<>(config.getLoadBalancers().size(), 1);
+        config.getLoadBalancers().forEach((key, value) -> result.put(key, 
ReadQueryLoadBalanceAlgorithmFactory.newInstance(value)));
+        return result;
+    }
+    
     @Override
     public int getOrder() {
         return ReadwriteSplittingOrder.ORDER;
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
index a4c9faccd60..e9ec6dc4f78 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRule.java
@@ -17,8 +17,6 @@
 
 package org.apache.shardingsphere.readwritesplitting.rule;
 
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.Getter;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
@@ -50,7 +48,6 @@ public final class ReadwriteSplittingDataSourceRule {
     
     public ReadwriteSplittingDataSourceRule(final 
ReadwriteSplittingDataSourceRuleConfiguration config, final 
ReadQueryLoadBalanceAlgorithm loadBalancer,
                                             final 
Collection<ShardingSphereRule> builtRules) {
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(config.getName()), 
"Name is required.");
         name = config.getName();
         this.loadBalancer = loadBalancer;
         readwriteSplittingStrategy = 
ReadwriteSplittingStrategyFactory.newInstance(config, builtRules);
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index 3eaae151762..8d9bd52d9bf 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.readwritesplitting.rule;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
 import lombok.Getter;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.distsql.constant.ExportableConstants;
@@ -62,13 +61,10 @@ public final class ReadwriteSplittingRule implements 
DatabaseRule, DataSourceCon
     
     public ReadwriteSplittingRule(final ReadwriteSplittingRuleConfiguration 
ruleConfig, final Collection<ShardingSphereRule> builtRules) {
         configuration = ruleConfig;
-        Preconditions.checkArgument(!ruleConfig.getDataSources().isEmpty(), 
"Replica query data source rules can not be empty.");
         ruleConfig.getLoadBalancers().forEach((key, value) -> 
loadBalancers.put(key, 
ReadQueryLoadBalanceAlgorithmFactory.newInstance(value)));
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            // TODO check if can not find load balancer should throw exception.
-            ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = 
Strings.isNullOrEmpty(each.getLoadBalancerName()) || 
!loadBalancers.containsKey(each.getLoadBalancerName())
-                    ? ReadQueryLoadBalanceAlgorithmFactory.newInstance()
+            ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = null == 
loadBalancers.get(each.getLoadBalancerName()) ? 
ReadQueryLoadBalanceAlgorithmFactory.newInstance()
                     : loadBalancers.get(each.getLoadBalancerName());
             dataSourceRules.put(each.getName(), new 
ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm, builtRules));
         }
@@ -76,13 +72,10 @@ public final class ReadwriteSplittingRule implements 
DatabaseRule, DataSourceCon
     
     public ReadwriteSplittingRule(final 
AlgorithmProvidedReadwriteSplittingRuleConfiguration ruleConfig, final 
Collection<ShardingSphereRule> builtRules) {
         configuration = ruleConfig;
-        Preconditions.checkArgument(!ruleConfig.getDataSources().isEmpty(), 
"Replica query data source rules can not be empty.");
         loadBalancers.putAll(ruleConfig.getLoadBalanceAlgorithms());
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            // TODO check if can not find load balancer should throw exception.
-            ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = 
Strings.isNullOrEmpty(each.getLoadBalancerName()) || 
!loadBalancers.containsKey(each.getLoadBalancerName())
-                    ? ReadQueryLoadBalanceAlgorithmFactory.newInstance()
+            ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = null == 
loadBalancers.get(each.getLoadBalancerName()) ? 
ReadQueryLoadBalanceAlgorithmFactory.newInstance()
                     : loadBalancers.get(each.getLoadBalancerName());
             dataSourceRules.put(each.getName(), new 
ReadwriteSplittingDataSourceRule(each, loadBalanceAlgorithm, builtRules));
         }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java
index 5243002abff..657a633e243 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.readwritesplitting.strategy;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -51,16 +50,12 @@ public final class ReadwriteSplittingStrategyFactory {
     }
     
     private static StaticReadwriteSplittingStrategy 
createStaticReadwriteSplittingStrategy(final 
StaticReadwriteSplittingStrategyConfiguration staticConfig) {
-        
Preconditions.checkArgument(!Strings.isNullOrEmpty(staticConfig.getWriteDataSourceName()),
 "Write data source name is required.");
-        
Preconditions.checkArgument(!staticConfig.getReadDataSourceNames().isEmpty(), 
"Read data source names are required.");
         return new 
StaticReadwriteSplittingStrategy(staticConfig.getWriteDataSourceName(), 
staticConfig.getReadDataSourceNames());
     }
     
     private static DynamicReadwriteSplittingStrategy 
createDynamicReadwriteSplittingStrategy(final 
DynamicReadwriteSplittingStrategyConfiguration dynamicConfig,
                                                                                
              final Collection<ShardingSphereRule> builtRules) {
-        
Preconditions.checkArgument(!Strings.isNullOrEmpty(dynamicConfig.getAutoAwareDataSourceName()),
 "Auto aware data source name is required.");
         Optional<ShardingSphereRule> dynamicDataSourceStrategy = 
builtRules.stream().filter(each -> each instanceof 
DynamicDataSourceContainedRule).findFirst();
-        Preconditions.checkArgument(dynamicDataSourceStrategy.isPresent(), 
"Dynamic data source strategy is required.");
         boolean allowWriteDataSourceQuery = 
Strings.isNullOrEmpty(dynamicConfig.getWriteDataSourceQueryEnabled()) ? 
Boolean.TRUE : 
Boolean.parseBoolean(dynamicConfig.getWriteDataSourceQueryEnabled());
         return new 
DynamicReadwriteSplittingStrategy(dynamicConfig.getAutoAwareDataSourceName(), 
allowWriteDataSourceQuery, (DynamicDataSourceContainedRule) 
dynamicDataSourceStrategy.get());
     }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTest.java
index f43d5bb8518..4eec3ff77e5 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.readwritesplitting.checker;
 
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
 import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationCheckerFactory;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
 import 
org.apache.shardingsphere.readwritesplitting.algorithm.config.AlgorithmProvidedReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.strategy.DynamicReadwriteSplittingStrategyConfiguration;
@@ -45,7 +46,7 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTe
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Arrays.asList(mock(DynamicDataSourceContainedRule.class)));
     }
     
     private AlgorithmProvidedReadwriteSplittingRuleConfiguration 
createValidConfiguration() {
@@ -53,6 +54,7 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTe
         ReadwriteSplittingDataSourceRuleConfiguration dataSourceConfig = 
mock(ReadwriteSplittingDataSourceRuleConfiguration.class);
         when(dataSourceConfig.getDynamicStrategy()).thenReturn(new 
DynamicReadwriteSplittingStrategyConfiguration("ds0", "false"));
         
when(result.getDataSources()).thenReturn(Collections.singleton(dataSourceConfig));
+        when(dataSourceConfig.getName()).thenReturn("readwrite_ds");
         return result;
     }
     
@@ -63,18 +65,19 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTe
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private AlgorithmProvidedReadwriteSplittingRuleConfiguration 
createInvalidConfiguration() {
         AlgorithmProvidedReadwriteSplittingRuleConfiguration result = 
mock(AlgorithmProvidedReadwriteSplittingRuleConfiguration.class);
         ReadwriteSplittingDataSourceRuleConfiguration dataSourceConfig = 
mock(ReadwriteSplittingDataSourceRuleConfiguration.class);
+        when(dataSourceConfig.getName()).thenReturn("readwrite_ds");
         
when(result.getDataSources()).thenReturn(Collections.singleton(dataSourceConfig));
         return result;
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
-    @Test(expected = IllegalStateException.class)
+    @Test(expected = IllegalArgumentException.class)
     public void assertCheckWhenConfigInvalidWriteDataSource() {
         AlgorithmProvidedReadwriteSplittingRuleConfiguration config = 
mock(AlgorithmProvidedReadwriteSplittingRuleConfiguration.class);
         List<ReadwriteSplittingDataSourceRuleConfiguration> configurations = 
Arrays.asList(createDataSourceRuleConfig(
@@ -83,7 +86,7 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTe
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
@@ -96,7 +99,7 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTe
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private ReadwriteSplittingDataSourceRuleConfiguration 
createDataSourceRuleConfig(final String writeDataSource, final List<String> 
readDataSources) {
@@ -105,6 +108,7 @@ public final class 
AlgorithmProvidedReadwriteSplittingRuleConfigurationCheckerTe
         
when(readwriteSplittingStrategy.getWriteDataSourceName()).thenReturn(writeDataSource);
         
when(readwriteSplittingStrategy.getReadDataSourceNames()).thenReturn(readDataSources);
         
when(result.getStaticStrategy()).thenReturn(readwriteSplittingStrategy);
+        when(result.getName()).thenReturn("readwrite_ds");
         return result;
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
index 5e2b66e5301..68aa7d380d2 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
@@ -17,17 +17,23 @@
 
 package org.apache.shardingsphere.readwritesplitting.checker;
 
+import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
 import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationCheckerFactory;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.strategy.DynamicReadwriteSplittingStrategyConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.strategy.StaticReadwriteSplittingStrategyConfiguration;
 import org.junit.Test;
 
+import javax.sql.DataSource;
 import java.util.Arrays;
+import java.util.Properties;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.LinkedHashMap;
 import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -45,12 +51,13 @@ public final class 
ReadwriteSplittingRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(ReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Arrays.asList(mock(DynamicDataSourceContainedRule.class)));
     }
     
     private ReadwriteSplittingRuleConfiguration createValidConfiguration() {
         ReadwriteSplittingRuleConfiguration result = 
mock(ReadwriteSplittingRuleConfiguration.class);
         ReadwriteSplittingDataSourceRuleConfiguration dataSourceConfig = 
mock(ReadwriteSplittingDataSourceRuleConfiguration.class);
+        when(dataSourceConfig.getName()).thenReturn("readwrite_ds");
         when(dataSourceConfig.getDynamicStrategy()).thenReturn(new 
DynamicReadwriteSplittingStrategyConfiguration("ds0", "false"));
         
when(result.getDataSources()).thenReturn(Collections.singletonList(dataSourceConfig));
         return result;
@@ -63,12 +70,13 @@ public final class 
ReadwriteSplittingRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(ReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private ReadwriteSplittingRuleConfiguration createInvalidConfiguration() {
         ReadwriteSplittingRuleConfiguration result = 
mock(ReadwriteSplittingRuleConfiguration.class);
         ReadwriteSplittingDataSourceRuleConfiguration dataSourceConfig = 
mock(ReadwriteSplittingDataSourceRuleConfiguration.class);
+        when(dataSourceConfig.getName()).thenReturn("readwrite_ds");
         
when(result.getDataSources()).thenReturn(Collections.singleton(dataSourceConfig));
         return result;
     }
@@ -78,12 +86,12 @@ public final class 
ReadwriteSplittingRuleConfigurationCheckerTest {
     public void assertCheckWhenConfigInvalidWriteDataSource() {
         ReadwriteSplittingRuleConfiguration config = 
mock(ReadwriteSplittingRuleConfiguration.class);
         List<ReadwriteSplittingDataSourceRuleConfiguration> configurations = 
Arrays.asList(createDataSourceRuleConfig(
-                "write_ds", Collections.emptyList()), 
createDataSourceRuleConfig("write_ds", Collections.emptyList()));
+                "write_ds", Arrays.asList("ds_0", "ds_1")), 
createDataSourceRuleConfig("write_ds", Arrays.asList("ds_2", "ds_3")));
         when(config.getDataSources()).thenReturn(configurations);
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(ReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, mockDataSources(), 
Collections.emptyList());
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
@@ -96,7 +104,24 @@ public final class 
ReadwriteSplittingRuleConfigurationCheckerTest {
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(ReadwriteSplittingRuleConfigurationChecker.class));
-        checker.get().check("test", config);
+        checker.get().check("test", config, mockDataSources(), 
Collections.emptyList());
+    }
+    
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    @Test(expected = IllegalStateException.class)
+    public void assertCheckWeightLoadBalanceInvalidDataSourceName() {
+        ReadwriteSplittingRuleConfiguration config = 
mock(ReadwriteSplittingRuleConfiguration.class);
+        List<ReadwriteSplittingDataSourceRuleConfiguration> configurations = 
Arrays.asList(createDataSourceRuleConfig("write_ds_0", 
Arrays.asList("read_ds_0", "read_ds_1")));
+        when(config.getDataSources()).thenReturn(configurations);
+        Properties props = new Properties();
+        props.setProperty("read_ds_2", "1");
+        props.setProperty("read_ds_1", "2");
+        ShardingSphereAlgorithmConfiguration algorithm = new 
ShardingSphereAlgorithmConfiguration("WEIGHT", props);
+        
when(config.getLoadBalancers()).thenReturn(Collections.singletonMap("weight_ds",
 algorithm));
+        Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
+        assertTrue(checker.isPresent());
+        assertThat(checker.get(), 
instanceOf(ReadwriteSplittingRuleConfigurationChecker.class));
+        checker.get().check("test", config, mockDataSources(), 
Collections.emptyList());
     }
     
     private ReadwriteSplittingDataSourceRuleConfiguration 
createDataSourceRuleConfig(final String writeDataSource, final List<String> 
readDataSources) {
@@ -105,6 +130,15 @@ public final class 
ReadwriteSplittingRuleConfigurationCheckerTest {
         
when(readwriteSplittingStrategy.getWriteDataSourceName()).thenReturn(writeDataSource);
         
when(readwriteSplittingStrategy.getReadDataSourceNames()).thenReturn(readDataSources);
         
when(result.getStaticStrategy()).thenReturn(readwriteSplittingStrategy);
+        when(result.getName()).thenReturn("readwrite_ds");
+        when(result.getLoadBalancerName()).thenReturn("weight_ds");
+        return result;
+    }
+    
+    private Map<String, DataSource> mockDataSources() {
+        Map<String, DataSource> result = new LinkedHashMap<>(2, 1);
+        result.put("read_ds_0", mock(DataSource.class));
+        result.put("read_ds_1", mock(DataSource.class));
         return result;
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRuleTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRuleTest.java
index 4e516c28ca1..1fe8be71ca6 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRuleTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingDataSourceRuleTest.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.readwritesplitting.rule;
 
 import 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RandomReadQueryLoadBalanceAlgorithm;
-import 
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RoundRobinReadQueryLoadBalanceAlgorithm;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.strategy.StaticReadwriteSplittingStrategyConfiguration;
 import org.junit.Before;
@@ -42,27 +41,6 @@ public final class ReadwriteSplittingDataSourceRuleTest {
                 new RandomReadQueryLoadBalanceAlgorithm(), 
Collections.emptyList());
     }
     
-    @Test(expected = IllegalArgumentException.class)
-    public void assertNewReadwriteSplittingDataSourceRuleWithoutName() {
-        new ReadwriteSplittingDataSourceRule(new 
ReadwriteSplittingDataSourceRuleConfiguration("",
-                new StaticReadwriteSplittingStrategyConfiguration("write_ds", 
Arrays.asList("read_ds")),
-                null, null), new RoundRobinReadQueryLoadBalanceAlgorithm(), 
Collections.emptyList());
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void 
assertNewReadwriteSplittingDataSourceRuleWithoutWriteDataSourceName() {
-        new ReadwriteSplittingDataSourceRule(new 
ReadwriteSplittingDataSourceRuleConfiguration("ds",
-                new StaticReadwriteSplittingStrategyConfiguration("", 
Arrays.asList("read_ds")),
-                null, null), new RoundRobinReadQueryLoadBalanceAlgorithm(), 
Collections.emptyList());
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void 
assertNewReadwriteSplittingDataSourceRuleWithEmptyReadDataSourceName() {
-        new ReadwriteSplittingDataSourceRule(new 
ReadwriteSplittingDataSourceRuleConfiguration("ds",
-                new StaticReadwriteSplittingStrategyConfiguration("write_ds", 
Collections.emptyList()),
-                null, null), new RoundRobinReadQueryLoadBalanceAlgorithm(), 
Collections.emptyList());
-    }
-    
     @Test
     public void assertGetReadDataSourceNamesWithoutDisabledDataSourceNames() {
         
assertThat(readwriteSplittingDataSourceRule.getEnabledReplicaDataSources(), 
is(Arrays.asList("read_ds_0", "read_ds_1")));
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
index 56631c05064..170a0b9086b 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
@@ -41,11 +41,6 @@ import static org.junit.Assert.assertTrue;
 
 public final class ReadwriteSplittingRuleTest {
     
-    @Test(expected = IllegalArgumentException.class)
-    public void assertNewWithEmptyDataSourceRule() {
-        new ReadwriteSplittingRule(new 
ReadwriteSplittingRuleConfiguration(Collections.emptyList(), 
Collections.emptyMap()), Collections.emptyList());
-    }
-    
     @Test
     public void assertFindDataSourceRule() {
         Optional<ReadwriteSplittingDataSourceRule> actual = 
createReadwriteSplittingRule().findDataSourceRule("readwrite");
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/checker/AbstractShadowRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/checker/AbstractShadowRuleConfigurationChecker.java
index c8f3054a0d8..5c55d05a2f3 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/checker/AbstractShadowRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/checker/AbstractShadowRuleConfigurationChecker.java
@@ -21,11 +21,13 @@ import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
 import 
org.apache.shardingsphere.shadow.api.config.table.ShadowTableConfiguration;
 import org.apache.shardingsphere.shadow.api.shadow.hint.HintShadowAlgorithm;
 import org.apache.shardingsphere.shadow.spi.ShadowAlgorithm;
 
+import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -39,7 +41,7 @@ import java.util.Set;
 public abstract class AbstractShadowRuleConfigurationChecker<T extends 
RuleConfiguration> implements RuleConfigurationChecker<T> {
     
     @Override
-    public final void check(final String databaseName, final T config) {
+    public final void check(final String databaseName, final T config, final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
rules) {
         checkShadowRuleConfiguration(config);
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/AlgorithmProvidedShadowRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/AlgorithmProvidedShadowRuleConfigurationCheckerTest.java
index 133ec45de1d..a94589a1662 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/AlgorithmProvidedShadowRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/AlgorithmProvidedShadowRuleConfigurationCheckerTest.java
@@ -24,15 +24,15 @@ import 
org.apache.shardingsphere.shadow.api.config.table.ShadowTableConfiguratio
 import org.apache.shardingsphere.shadow.factory.ShadowAlgorithmFactory;
 import org.junit.Test;
 
-import java.util.Collections;
 import java.util.LinkedList;
 import java.util.Properties;
+import java.util.Collections;
 
 public final class AlgorithmProvidedShadowRuleConfigurationCheckerTest {
     
     @Test
     public void assertCheck() {
-        new AlgorithmProvidedShadowRuleConfigurationChecker().check("", 
createAlgorithmProvidedShadowRuleConfiguration());
+        new AlgorithmProvidedShadowRuleConfigurationChecker().check("", 
createAlgorithmProvidedShadowRuleConfiguration(), Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private AlgorithmProvidedShadowRuleConfiguration 
createAlgorithmProvidedShadowRuleConfiguration() {
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
index 2ec912b02c5..857e4a1f5dc 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
@@ -28,12 +28,13 @@ import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Collections;
 
 public final class ShadowRuleConfigurationCheckerTest {
     
     @Test
     public void assertCheck() {
-        new ShadowRuleConfigurationChecker().check("", 
createShadowRuleConfiguration());
+        new ShadowRuleConfigurationChecker().check("", 
createShadowRuleConfiguration(), Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private ShadowRuleConfiguration createShadowRuleConfiguration() {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
index a1fb1d7c7ce..d877e2c5cc8 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.sharding.checker;
 import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
@@ -27,7 +28,9 @@ import 
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerate
 import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
 
+import javax.sql.DataSource;
 import java.util.Collection;
+import java.util.Map;
 
 /**
  * Abstract sharding rule configuration checker.
@@ -37,7 +40,7 @@ import java.util.Collection;
 public abstract class AbstractShardingRuleConfigurationChecker<T extends 
RuleConfiguration> implements RuleConfigurationChecker<T> {
     
     @Override
-    public final void check(final String databaseName, final T config) {
+    public final void check(final String databaseName, final T config, final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
rules) {
         Collection<String> keyGenerators = getKeyGenerators(config);
         Collection<String> auditors = getAuditors(config);
         Collection<String> shardingAlgorithms = getShardingAlgorithms(config);
@@ -50,8 +53,6 @@ public abstract class 
AbstractShardingRuleConfigurationChecker<T extends RuleCon
     
     private void checkTableConfiguration(final String databaseName, final 
Collection<ShardingTableRuleConfiguration> tables, final 
Collection<ShardingAutoTableRuleConfiguration> autoTables,
                                          final Collection<String> 
keyGenerators, final Collection<String> auditors, final Collection<String> 
shardingAlgorithms) {
-        Preconditions.checkState(!tables.isEmpty() || !autoTables.isEmpty(),
-                "No available sharding table or autoTable configurations in 
database `%s`.", databaseName);
         for (ShardingTableRuleConfiguration each : tables) {
             checkKeyGenerateStrategy(databaseName, 
each.getKeyGenerateStrategy(), keyGenerators);
             checkAuditStrategy(databaseName, each.getAuditStrategy(), 
auditors);
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/AlgorithmProvidedShardingRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/AlgorithmProvidedShardingRuleConfigurationCheckerTest.java
index 01805ec023f..744e5b1f8a6 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/AlgorithmProvidedShardingRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/AlgorithmProvidedShardingRuleConfigurationCheckerTest.java
@@ -46,21 +46,7 @@ public final class 
AlgorithmProvidedShardingRuleConfigurationCheckerTest {
         ShardingStrategyConfiguration shardingStrategyConfig = 
createShardingStrategyConfiguration();
         
ruleConfig.setTables(Collections.singleton(createShardingTableRuleConfiguration(shardingStrategyConfig,
 shardingAuditStrategyConfig, ruleConfig.getDefaultKeyGenerateStrategy())));
         
ruleConfig.setAutoTables(Collections.singleton(createShardingAutoTableRuleConfiguration(shardingStrategyConfig,
 shardingAuditStrategyConfig, ruleConfig.getDefaultKeyGenerateStrategy())));
-        getChecker(ruleConfig).check("foo_db", ruleConfig);
-    }
-    
-    @Test(expected = IllegalStateException.class)
-    public void assertCheckTableConfigurationInitFailed() {
-        AlgorithmProvidedShardingRuleConfiguration ruleConfig = 
createRuleConfiguration();
-        getChecker(ruleConfig).check("foo_db", ruleConfig);
-    }
-    
-    @Test(expected = IllegalStateException.class)
-    public void assertCheckTableConfigurationFailed() {
-        AlgorithmProvidedShardingRuleConfiguration ruleConfig = 
createRuleConfiguration();
-        
ruleConfig.setTables(Collections.singleton(createShardingTableRuleConfiguration(null,
 null, null)));
-        
ruleConfig.setAutoTables(Collections.singleton(createShardingAutoTableRuleConfiguration(null,
 null, null)));
-        getChecker(ruleConfig).check("foo_db", ruleConfig);
+        getChecker(ruleConfig).check("foo_db", ruleConfig, 
Collections.emptyMap(), Collections.emptyList());
     }
     
     private AlgorithmProvidedShardingRuleConfiguration 
createRuleConfiguration() {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
index 0162ac07192..198fc08cfaf 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
@@ -44,13 +44,7 @@ public final class ShardingRuleConfigurationCheckerTest {
         ShardingStrategyConfiguration shardingStrategyConfig = 
createShardingStrategyConfiguration();
         
ruleConfig.setTables(Collections.singleton(createShardingTableRuleConfiguration(shardingStrategyConfig,
 shardingAuditStrategyConfig, ruleConfig.getDefaultKeyGenerateStrategy())));
         
ruleConfig.setAutoTables(Collections.singleton(createShardingAutoTableRuleConfiguration(shardingStrategyConfig,
 shardingAuditStrategyConfig, ruleConfig.getDefaultKeyGenerateStrategy())));
-        getChecker(ruleConfig).check("foo_db", ruleConfig);
-    }
-    
-    @Test(expected = IllegalStateException.class)
-    public void assertCheckTableConfigurationInitFailed() {
-        ShardingRuleConfiguration ruleConfig = createRuleConfiguration();
-        getChecker(ruleConfig).check("foo_db", ruleConfig);
+        getChecker(ruleConfig).check("foo_db", ruleConfig, 
Collections.emptyMap(), Collections.emptyList());
     }
     
     @Test(expected = IllegalStateException.class)
@@ -58,7 +52,7 @@ public final class ShardingRuleConfigurationCheckerTest {
         ShardingRuleConfiguration configuration = createRuleConfiguration();
         
configuration.setTables(Collections.singletonList(createShardingTableRuleConfiguration(null,
 null, null)));
         
configuration.setAutoTables(Collections.singleton(createShardingAutoTableRuleConfiguration(null,
 null, null)));
-        getChecker(configuration).check("foo_db", configuration);
+        getChecker(configuration).check("foo_db", configuration, 
Collections.emptyMap(), Collections.emptyList());
     }
     
     private ShardingRuleConfiguration createRuleConfiguration() {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingRuleAlgorithmProviderConfigurationYamlSwapperTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingRuleAlgorithmProviderConfigurationYamlSwapperTest.java
index f6100c803ff..660b942e9c9 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingRuleAlgorithmProviderConfigurationYamlSwapperTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/yaml/swapper/ShardingRuleAlgorithmProviderConfigurationYamlSwapperTest.java
@@ -91,7 +91,6 @@ public final class 
ShardingRuleAlgorithmProviderConfigurationYamlSwapperTest {
         yamlKeyGenerateStrategyConfiguration.setColumn("foo_column");
         
result.setDefaultKeyGenerateStrategy(yamlKeyGenerateStrategyConfiguration);
         
result.setDefaultAuditStrategy(mock(YamlShardingAuditStrategyConfiguration.class));
-        
         result.setDefaultShardingColumn("foo_column");
         return result;
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationChecker.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationChecker.java
index 7e877151f30..fba1d3a025f 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationChecker.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationChecker.java
@@ -18,9 +18,14 @@
 package org.apache.shardingsphere.infra.config.checker;
 
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.spi.type.ordered.OrderedSPI;
 
+import javax.sql.DataSource;
+import java.util.Collection;
+import java.util.Map;
+
 /**
  * Rule configuration checker.
  * 
@@ -34,6 +39,8 @@ public interface RuleConfigurationChecker<T extends 
RuleConfiguration> extends O
      * 
      * @param databaseName database name to be checked
      * @param config rule configuration to be checked
+     * @param dataSourceMap data sources to be checked
+     * @param rules rules to be checked
      */
-    void check(String databaseName, T config);
+    void check(String databaseName, T config, Map<String, DataSource> 
dataSourceMap, Collection<ShardingSphereRule> rules);
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
index 4039e9402ff..775b050540c 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.rule.builder.database;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationCheckerFactory;
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import 
org.apache.shardingsphere.infra.config.function.DistributedRuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.function.EnhancedRuleConfiguration;
@@ -53,6 +54,7 @@ public final class DatabaseRulesBuilder {
     public static Collection<ShardingSphereRule> build(final String 
databaseName, final DatabaseConfiguration databaseConfig, final InstanceContext 
instanceContext) {
         Collection<ShardingSphereRule> result = new LinkedList<>();
         for (Entry<RuleConfiguration, DatabaseRuleBuilder> entry : 
getRuleBuilderMap(databaseConfig).entrySet()) {
+            
RuleConfigurationCheckerFactory.findInstance(entry.getKey()).ifPresent(optional 
-> optional.check(databaseName, entry.getKey(), 
databaseConfig.getDataSources(), result));
             result.add(entry.getValue().build(entry.getKey(), databaseName, 
databaseConfig.getDataSources(), result, instanceContext));
         }
         return result;
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationCheckerFixture.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationCheckerFixture.java
index adc74c93f95..36a817f95c6 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationCheckerFixture.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/config/checker/RuleConfigurationCheckerFixture.java
@@ -18,11 +18,16 @@
 package org.apache.shardingsphere.infra.config.checker;
 
 import org.apache.shardingsphere.infra.fixture.TestRuleConfiguration;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+
+import javax.sql.DataSource;
+import java.util.Collection;
+import java.util.Map;
 
 public final class RuleConfigurationCheckerFixture implements 
RuleConfigurationChecker<TestRuleConfiguration> {
     
     @Override
-    public void check(final String databaseName, final TestRuleConfiguration 
config) {
+    public void check(final String databaseName, final TestRuleConfiguration 
config, final Map<String, DataSource> dataSourceMap, final 
Collection<ShardingSphereRule> rules) {
         
     }
     
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
index 39f71dc5522..04b23a596ed 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
@@ -21,7 +21,6 @@ import 
org.apache.shardingsphere.driver.jdbc.adapter.AbstractDataSourceAdapter;
 import org.apache.shardingsphere.driver.jdbc.context.JDBCContext;
 import org.apache.shardingsphere.driver.state.DriverStateContext;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationCheckerFactory;
 import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
 import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.config.scope.GlobalRuleConfiguration;
@@ -61,17 +60,11 @@ public final class ShardingSphereDataSource extends 
AbstractDataSourceAdapter im
     
     public ShardingSphereDataSource(final String databaseName, final 
ModeConfiguration modeConfig, final Map<String, DataSource> dataSourceMap,
                                     final Collection<RuleConfiguration> 
ruleConfigs, final Properties props) throws SQLException {
-        checkRuleConfiguration(databaseName, ruleConfigs);
         this.databaseName = databaseName;
         contextManager = createContextManager(databaseName, modeConfig, 
dataSourceMap, ruleConfigs, null == props ? new Properties() : props);
         jdbcContext = new 
JDBCContext(contextManager.getDataSourceMap(databaseName));
     }
     
-    @SuppressWarnings("unchecked")
-    private void checkRuleConfiguration(final String databaseName, final 
Collection<RuleConfiguration> ruleConfigs) {
-        ruleConfigs.forEach(each -> 
RuleConfigurationCheckerFactory.findInstance(each).ifPresent(optional -> 
optional.check(databaseName, each)));
-    }
-    
     private ContextManager createContextManager(final String databaseName, 
final ModeConfiguration modeConfig, final Map<String, DataSource> dataSourceMap,
                                                 final 
Collection<RuleConfiguration> ruleConfigs, final Properties props) throws 
SQLException {
         InstanceMetaData instanceMetaData = 
InstanceMetaDataBuilderFactory.create("JDBC", -1);
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
index a9ae7026c06..86446c7e915 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
@@ -138,12 +138,12 @@ public class SpringBootStarterTest {
     }
     
     private void assertReadwriteSplittingRule(final ReadwriteSplittingRule 
actual) {
-        assertThat(actual.getDataSourceMapper(), 
is(Collections.singletonMap("readwrite_ds", Arrays.asList("write_ds", 
"read_ds_0", "read_ds_1"))));
+        assertThat(actual.getDataSourceMapper(), 
is(Collections.singletonMap("readwrite_ds", Arrays.asList("write_ds", "ds0", 
"ds1"))));
         ReadwriteSplittingDataSourceRule dataSourceRule = 
actual.getSingleDataSourceRule();
         assertThat(dataSourceRule.getName(), is("readwrite_ds"));
         StaticReadwriteSplittingStrategy staticReadwriteSplittingType = 
(StaticReadwriteSplittingStrategy) 
dataSourceRule.getReadwriteSplittingStrategy();
         assertThat(staticReadwriteSplittingType.getWriteDataSource(), 
is("write_ds"));
-        assertThat(staticReadwriteSplittingType.getReadDataSources(), 
is(Arrays.asList("read_ds_0", "read_ds_1")));
+        assertThat(staticReadwriteSplittingType.getReadDataSources(), 
is(Arrays.asList("ds0", "ds1")));
         assertThat(dataSourceRule.getLoadBalancer(), 
instanceOf(RandomReadQueryLoadBalanceAlgorithm.class));
     }
     
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/resources/application.properties
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/resources/application.properties
index e31ac8b356e..f6dcc0e00cd 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/resources/application.properties
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/resources/application.properties
@@ -25,7 +25,7 @@ 
spring.shardingsphere.datasource.ds1.type=org.apache.shardingsphere.test.mock.Mo
 
spring.shardingsphere.rules.readwrite-splitting.load-balancers.random.type=RANDOM
 
 
spring.shardingsphere.rules.readwrite-splitting.data-sources.readwrite_ds.static-strategy.write-data-source-name=write_ds
-spring.shardingsphere.rules.readwrite-splitting.data-sources.readwrite_ds.static-strategy.read-data-source-names=read_ds_0,read_ds_1
+spring.shardingsphere.rules.readwrite-splitting.data-sources.readwrite_ds.static-strategy.read-data-source-names=ds0,ds1
 
spring.shardingsphere.rules.readwrite-splitting.data-sources.readwrite_ds.load-balancer-name=random
 
 
spring.shardingsphere.rules.sharding.sharding-algorithms.databaseShardingAlgorithm.type=INLINE
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/BootstrapInitializer.java
 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/BootstrapInitializer.java
index e4317feca1a..dda3d0e5fad 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/BootstrapInitializer.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/BootstrapInitializer.java
@@ -19,8 +19,6 @@ package org.apache.shardingsphere.proxy.initializer;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationCheckerFactory;
-import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
@@ -38,7 +36,6 @@ import 
org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.version.ShardingSphereProxyVersion;
 
 import java.sql.SQLException;
-import java.util.Map.Entry;
 
 /**
  * Bootstrap initializer.
@@ -57,20 +54,12 @@ public final class BootstrapInitializer {
     public void init(final YamlProxyConfiguration yamlConfig, final int port) 
throws SQLException {
         ModeConfiguration modeConfig = null == 
yamlConfig.getServerConfiguration().getMode() ? null : new 
ModeConfigurationYamlSwapper().swapToObject(yamlConfig.getServerConfiguration().getMode());
         ProxyConfiguration proxyConfig = new 
YamlProxyConfigurationSwapper().swap(yamlConfig);
-        checkRuleConfiguration(proxyConfig);
         ContextManager contextManager = createContextManager(proxyConfig, 
modeConfig, port);
         ProxyContext.init(contextManager);
         contextManagerInitializedCallback(modeConfig, contextManager);
         ShardingSphereProxyVersion.setVersion(contextManager);
     }
     
-    @SuppressWarnings("unchecked")
-    private void checkRuleConfiguration(final ProxyConfiguration proxyConfig) {
-        for (Entry<String, DatabaseConfiguration> entry : 
proxyConfig.getDatabaseConfigurations().entrySet()) {
-            entry.getValue().getRuleConfigurations().forEach(each -> 
RuleConfigurationCheckerFactory.findInstance(each).ifPresent(optional -> 
optional.check(entry.getKey(), each)));
-        }
-    }
-    
     private ContextManager createContextManager(final ProxyConfiguration 
proxyConfig, final ModeConfiguration modeConfig, final int port) throws 
SQLException {
         ContextManagerBuilderParameter parameter = new 
ContextManagerBuilderParameter(modeConfig, 
proxyConfig.getDatabaseConfigurations(),
                 proxyConfig.getGlobalConfiguration().getRules(), 
proxyConfig.getGlobalConfiguration().getProperties(), 
proxyConfig.getGlobalConfiguration().getLabels(),
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/RuleConfigurationFixtureChecker.java
 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/RuleConfigurationFixtureChecker.java
index b2385bc4320..e6f729b0207 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/RuleConfigurationFixtureChecker.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/RuleConfigurationFixtureChecker.java
@@ -18,11 +18,17 @@
 package org.apache.shardingsphere.proxy.fixture;
 
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+
+import javax.sql.DataSource;
+import java.util.Collection;
+import java.util.Map;
 
 public final class RuleConfigurationFixtureChecker implements 
RuleConfigurationChecker<RuleConfigurationFixture> {
     
     @Override
-    public void check(final String databaseName, final 
RuleConfigurationFixture config) {
+    public void check(final String databaseName, final 
RuleConfigurationFixture config,
+                      final Map<String, DataSource> dataSourceMap, final 
Collection<ShardingSphereRule> rules) {
     }
     
     @Override
diff --git 
a/shardingsphere-test/shardingsphere-integration-driver-test/src/test/java/org/apache/shardingsphere/driver/fixture/TestRuleConfigurationChecker.java
 
b/shardingsphere-test/shardingsphere-integration-driver-test/src/test/java/org/apache/shardingsphere/driver/fixture/TestRuleConfigurationChecker.java
index ee10ff6a547..f320e56619f 100644
--- 
a/shardingsphere-test/shardingsphere-integration-driver-test/src/test/java/org/apache/shardingsphere/driver/fixture/TestRuleConfigurationChecker.java
+++ 
b/shardingsphere-test/shardingsphere-integration-driver-test/src/test/java/org/apache/shardingsphere/driver/fixture/TestRuleConfigurationChecker.java
@@ -18,11 +18,16 @@
 package org.apache.shardingsphere.driver.fixture;
 
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+
+import javax.sql.DataSource;
+import java.util.Collection;
+import java.util.Map;
 
 public final class TestRuleConfigurationChecker implements 
RuleConfigurationChecker<TestRuleConfiguration> {
     
     @Override
-    public void check(final String databaseName, final TestRuleConfiguration 
config) {
+    public void check(final String databaseName, final TestRuleConfiguration 
config, final Map<String, DataSource> dataSourceMap, final 
Collection<ShardingSphereRule> rules) {
     }
     
     @Override

Reply via email to