You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2024/03/24 05:45:53 UTC

(shardingsphere) branch master updated: Add ImportRuleConfigurationProvider.getRequiredDataSourceNames() (#30623)

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

sunnianjun 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 1b4a52a7796 Add ImportRuleConfigurationProvider.getRequiredDataSourceNames() (#30623)
1b4a52a7796 is described below

commit 1b4a52a7796a1fd4f3fac9c4ef2b9705d4366e59
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Mar 24 13:45:46 2024 +0800

    Add ImportRuleConfigurationProvider.getRequiredDataSourceNames() (#30623)
    
    * Add ImportRuleConfigurationProvider.getRequiredDataSourceNames()
    
    * Add ImportRuleConfigurationProvider.getRequiredDataSourceNames()
---
 ...teSplittingImportRuleConfigurationProvider.java | 31 ++++-------
 ...littingImportRuleConfigurationProviderTest.java |  3 +-
 .../ShadowImportRuleConfigurationProvider.java     | 40 ++++----------
 .../ShardingImportRuleConfigurationProvider.java   | 39 ++++---------
 ...hardingImportRuleConfigurationProviderTest.java |  3 +-
 .../database/ImportRuleConfigurationChecker.java   | 64 ++++++++++++++++++++++
 .../database/ImportRuleConfigurationProvider.java  | 13 +++++
 .../YamlDatabaseConfigurationImportExecutor.java   |  6 +-
 8 files changed, 114 insertions(+), 85 deletions(-)

diff --git a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
index 9be7a390639..aeeac9b6298 100644
--- a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
+++ b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
@@ -18,18 +18,14 @@
 package org.apache.shardingsphere.readwritesplitting.distsql.handler.provider;
 
 import org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
-import org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import org.apache.shardingsphere.infra.algorithm.loadbalancer.core.LoadBalanceAlgorithm;
-import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 
 import java.util.Collection;
 import java.util.LinkedHashSet;
-import java.util.stream.Collectors;
 
 /**
  * Readwrite-splitting import rule configuration provider.
@@ -38,32 +34,25 @@ public final class ReadwriteSplittingImportRuleConfigurationProvider implements
     
     @Override
     public void check(final ShardingSphereDatabase database, final ReadwriteSplittingRuleConfiguration ruleConfig) {
-        checkDataSources(database, ruleConfig);
         checkLoadBalancers(ruleConfig);
     }
     
-    private void checkDataSources(final ShardingSphereDatabase database, final ReadwriteSplittingRuleConfiguration ruleConfig) {
-        Collection<String> requiredDataSources = new LinkedHashSet<>();
+    private void checkLoadBalancers(final ReadwriteSplittingRuleConfiguration ruleConfig) {
+        ruleConfig.getLoadBalancers().values().forEach(each -> TypedSPILoader.checkService(LoadBalanceAlgorithm.class, each.getType(), each.getProps()));
+    }
+    
+    @Override
+    public Collection<String> getRequiredDataSourceNames(final ReadwriteSplittingRuleConfiguration ruleConfig) {
+        Collection<String> result = new LinkedHashSet<>();
         for (ReadwriteSplittingDataSourceRuleConfiguration each : ruleConfig.getDataSources()) {
             if (null != each.getWriteDataSourceName()) {
-                requiredDataSources.add(each.getWriteDataSourceName());
+                result.add(each.getWriteDataSourceName());
             }
             if (!each.getReadDataSourceNames().isEmpty()) {
-                requiredDataSources.addAll(each.getReadDataSourceNames());
+                result.addAll(each.getReadDataSourceNames());
             }
         }
-        Collection<String> notExistedDataSources = database.getResourceMetaData().getNotExistedDataSources(requiredDataSources);
-        Collection<String> logicalDataSources = getLogicDataSources(database);
-        notExistedDataSources.removeIf(logicalDataSources::contains);
-        ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () -> new MissingRequiredStorageUnitsException(database.getName(), notExistedDataSources));
-    }
-    
-    private Collection<String> getLogicDataSources(final ShardingSphereDatabase database) {
-        return database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class).stream().flatMap(each -> each.getDataSourceMapper().keySet().stream()).collect(Collectors.toSet());
-    }
-    
-    private void checkLoadBalancers(final ReadwriteSplittingRuleConfiguration ruleConfig) {
-        ruleConfig.getLoadBalancers().values().forEach(each -> TypedSPILoader.checkService(LoadBalanceAlgorithm.class, each.getType(), each.getProps()));
+        return result;
     }
     
     @Override
diff --git a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
index 13275211ec5..f9d20a89a22 100644
--- a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
+++ b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.readwritesplitting.distsql.handler.provider;
 
+import org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
 import org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -46,7 +47,7 @@ class ReadwriteSplittingImportRuleConfigurationProviderTest {
     void assertCheckDataSources() {
         ShardingSphereDatabase database = mockDatabaseWithDataSource();
         ReadwriteSplittingRuleConfiguration currentRuleConfig = getRuleConfigWithNotExistedDataSources();
-        assertThrows(MissingRequiredStorageUnitsException.class, () -> importRuleConfigProvider.check(database, currentRuleConfig));
+        assertThrows(MissingRequiredStorageUnitsException.class, () -> ImportRuleConfigurationChecker.checkRule(currentRuleConfig, database));
     }
     
     @Test
diff --git a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
index da3bab54f63..b9ebb241217 100644
--- a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
+++ b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
@@ -19,10 +19,8 @@ package org.apache.shardingsphere.shadow.distsql.handler.provider;
 
 import org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
 import org.apache.shardingsphere.distsql.handler.exception.rule.DuplicateRuleException;
-import org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.spi.ShadowAlgorithm;
@@ -39,20 +37,23 @@ public final class ShadowImportRuleConfigurationProvider implements ImportRuleCo
     
     @Override
     public void check(final ShardingSphereDatabase database, final ShadowRuleConfiguration ruleConfig) {
-        checkDataSources(database, ruleConfig);
         checkTables(database.getName(), ruleConfig);
         checkShadowAlgorithms(ruleConfig);
     }
     
-    private void checkDataSources(final ShardingSphereDatabase database, final ShadowRuleConfiguration ruleConfig) {
-        Collection<String> requiredResource = getRequiredResources(ruleConfig);
-        Collection<String> notExistedResources = database.getResourceMetaData().getNotExistedDataSources(requiredResource);
-        Collection<String> logicResources = getLogicDataSources(database);
-        notExistedResources.removeIf(logicResources::contains);
-        ShardingSpherePreconditions.checkState(notExistedResources.isEmpty(), () -> new MissingRequiredStorageUnitsException(database.getName(), notExistedResources));
+    private void checkTables(final String databaseName, final ShadowRuleConfiguration ruleConfig) {
+        Collection<String> tableNames = ruleConfig.getTables().keySet();
+        Collection<String> duplicatedTables = tableNames.stream().collect(Collectors.groupingBy(each -> each, Collectors.counting())).entrySet().stream()
+                .filter(each -> each.getValue() > 1).map(Entry::getKey).collect(Collectors.toSet());
+        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () -> new DuplicateRuleException("SHADOW", databaseName, duplicatedTables));
     }
     
-    private Collection<String> getRequiredResources(final ShadowRuleConfiguration ruleConfig) {
+    private void checkShadowAlgorithms(final ShadowRuleConfiguration ruleConfig) {
+        ruleConfig.getShadowAlgorithms().values().forEach(each -> TypedSPILoader.checkService(ShadowAlgorithm.class, each.getType(), each.getProps()));
+    }
+    
+    @Override
+    public Collection<String> getRequiredDataSourceNames(final ShadowRuleConfiguration ruleConfig) {
         Collection<String> result = new LinkedHashSet<>();
         ruleConfig.getDataSources().forEach(each -> {
             if (null != each.getShadowDataSourceName()) {
@@ -65,25 +66,6 @@ public final class ShadowImportRuleConfigurationProvider implements ImportRuleCo
         return result;
     }
     
-    private Collection<String> getLogicDataSources(final ShardingSphereDatabase database) {
-        Collection<String> result = new LinkedHashSet<>();
-        for (DataSourceMapperRuleAttribute each : database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)) {
-            result.addAll(each.getDataSourceMapper().keySet());
-        }
-        return result;
-    }
-    
-    private void checkTables(final String databaseName, final ShadowRuleConfiguration ruleConfig) {
-        Collection<String> tableNames = ruleConfig.getTables().keySet();
-        Collection<String> duplicatedTables = tableNames.stream().collect(Collectors.groupingBy(each -> each, Collectors.counting())).entrySet().stream()
-                .filter(each -> each.getValue() > 1).map(Entry::getKey).collect(Collectors.toSet());
-        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () -> new DuplicateRuleException("SHADOW", databaseName, duplicatedTables));
-    }
-    
-    private void checkShadowAlgorithms(final ShadowRuleConfiguration ruleConfig) {
-        ruleConfig.getShadowAlgorithms().values().forEach(each -> TypedSPILoader.checkService(ShadowAlgorithm.class, each.getType(), each.getProps()));
-    }
-    
     @Override
     public Class<ShadowRuleConfiguration> getType() {
         return ShadowRuleConfiguration.class;
diff --git a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
index 83e6a199f74..2099e919c68 100644
--- a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
+++ b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
@@ -19,14 +19,12 @@ package org.apache.shardingsphere.sharding.distsql.handler.provider;
 
 import org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
 import org.apache.shardingsphere.distsql.handler.exception.rule.DuplicateRuleException;
-import org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.algorithm.keygen.core.KeyGenerateAlgorithm;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
@@ -49,7 +47,6 @@ public final class ShardingImportRuleConfigurationProvider implements ImportRule
     @Override
     public void check(final ShardingSphereDatabase database, final ShardingRuleConfiguration ruleConfig) {
         checkLogicTables(database.getName(), ruleConfig);
-        checkDataSources(database, ruleConfig);
         checkShardingAlgorithms(ruleConfig.getShardingAlgorithms().values());
         checkKeyGeneratorAlgorithms(ruleConfig.getKeyGenerators().values());
     }
@@ -62,45 +59,29 @@ public final class ShardingImportRuleConfigurationProvider implements ImportRule
         ShardingSpherePreconditions.checkState(duplicatedLogicTables.isEmpty(), () -> new DuplicateRuleException("sharding", databaseName, duplicatedLogicTables));
     }
     
-    private void checkDataSources(final ShardingSphereDatabase database, final ShardingRuleConfiguration ruleConfig) {
-        Collection<String> requiredDataSources = getRequiredDataSources(ruleConfig);
-        Collection<String> notExistedDataSources = database.getResourceMetaData().getNotExistedDataSources(requiredDataSources);
-        Collection<String> logicDataSources = getLogicDataSources(database);
-        notExistedDataSources.removeIf(logicDataSources::contains);
-        ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () -> new MissingRequiredStorageUnitsException(database.getName(), notExistedDataSources));
+    private void checkShardingAlgorithms(final Collection<AlgorithmConfiguration> algorithmConfigs) {
+        algorithmConfigs.forEach(each -> TypedSPILoader.checkService(ShardingAlgorithm.class, each.getType(), each.getProps()));
+    }
+    
+    private void checkKeyGeneratorAlgorithms(final Collection<AlgorithmConfiguration> algorithmConfigs) {
+        algorithmConfigs.stream().filter(Objects::nonNull).forEach(each -> TypedSPILoader.checkService(KeyGenerateAlgorithm.class, each.getType(), each.getProps()));
     }
     
-    private Collection<String> getRequiredDataSources(final ShardingRuleConfiguration ruleConfig) {
+    @Override
+    public Collection<String> getRequiredDataSourceNames(final ShardingRuleConfiguration ruleConfig) {
         Collection<String> result = new LinkedHashSet<>();
         ruleConfig.getTables().forEach(each -> result.addAll(getDataSourceNames(each)));
         ruleConfig.getAutoTables().forEach(each -> result.addAll(getDataSourceNames(each)));
         return result;
     }
     
-    private Collection<String> getDataSourceNames(final ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
-        Collection<String> actualDataSources = InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate();
-        return new HashSet<>(actualDataSources);
-    }
-    
     private Collection<String> getDataSourceNames(final ShardingTableRuleConfiguration shardingTableRuleConfig) {
         Collection<String> actualDataNodes = InlineExpressionParserFactory.newInstance(shardingTableRuleConfig.getActualDataNodes()).splitAndEvaluate();
         return actualDataNodes.stream().map(each -> new DataNode(each).getDataSourceName()).collect(Collectors.toList());
     }
     
-    private Collection<String> getLogicDataSources(final ShardingSphereDatabase database) {
-        Collection<String> result = new LinkedHashSet<>();
-        for (DataSourceMapperRuleAttribute each : database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)) {
-            result.addAll(each.getDataSourceMapper().keySet());
-        }
-        return result;
-    }
-    
-    private void checkShardingAlgorithms(final Collection<AlgorithmConfiguration> algorithmConfigs) {
-        algorithmConfigs.forEach(each -> TypedSPILoader.checkService(ShardingAlgorithm.class, each.getType(), each.getProps()));
-    }
-    
-    private void checkKeyGeneratorAlgorithms(final Collection<AlgorithmConfiguration> algorithmConfigs) {
-        algorithmConfigs.stream().filter(Objects::nonNull).forEach(each -> TypedSPILoader.checkService(KeyGenerateAlgorithm.class, each.getType(), each.getProps()));
+    private Collection<String> getDataSourceNames(final ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
+        return new HashSet<>(InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate());
     }
     
     @Override
diff --git a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
index 2a7daf22128..fe3da7f9a1e 100644
--- a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
+++ b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.sharding.distsql.provider;
 
+import org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
 import org.apache.shardingsphere.distsql.handler.exception.rule.DuplicateRuleException;
 import org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
@@ -49,7 +50,7 @@ class ShardingImportRuleConfigurationProviderTest {
     void assertCheckDataSources() {
         ShardingRuleConfiguration currentRuleConfig = new ShardingRuleConfiguration();
         currentRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_order", "ds_${0..2}.t_order_${0..2}"));
-        assertThrows(MissingRequiredStorageUnitsException.class, () -> new ShardingImportRuleConfigurationProvider().check(mockDatabaseWithDataSource(), currentRuleConfig));
+        assertThrows(MissingRequiredStorageUnitsException.class, () -> ImportRuleConfigurationChecker.checkRule(currentRuleConfig, mockDatabaseWithDataSource()));
     }
     
     @Test
diff --git a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
new file mode 100644
index 00000000000..d24d9db9fa3
--- /dev/null
+++ b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+
+import java.util.Collection;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Import rule configuration checker.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ImportRuleConfigurationChecker {
+    
+    /**
+     * Check rule.
+     * 
+     * @param ruleConfig rule configuration
+     * @param database database
+     */
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public static void checkRule(final RuleConfiguration ruleConfig, final ShardingSphereDatabase database) {
+        Optional<ImportRuleConfigurationProvider> importProvider = TypedSPILoader.findService(ImportRuleConfigurationProvider.class, ruleConfig.getClass());
+        if (importProvider.isPresent()) {
+            Collection<String> requiredDataSourceNames = importProvider.get().getRequiredDataSourceNames(ruleConfig);
+            if (!requiredDataSourceNames.isEmpty()) {
+                checkDataSourcesExisted(database, requiredDataSourceNames);
+            }
+            importProvider.get().check(database, ruleConfig);
+        }
+    }
+    
+    private static void checkDataSourcesExisted(final ShardingSphereDatabase database, final Collection<String> requiredDataSourceNames) {
+        Collection<String> notExistedDataSources = database.getResourceMetaData().getNotExistedDataSources(requiredDataSourceNames);
+        Collection<String> logicDataSources = database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class).stream()
+                .flatMap(each -> each.getDataSourceMapper().keySet().stream()).collect(Collectors.toSet());
+        notExistedDataSources.removeIf(logicDataSources::contains);
+        ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () -> new MissingRequiredStorageUnitsException(database.getName(), notExistedDataSources));
+    }
+}
diff --git a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
index 61195f43e5c..f428b6cfc92 100644
--- a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
+++ b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
@@ -22,6 +22,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI;
 
+import java.util.Collection;
+import java.util.Collections;
+
 /**
  * Import rule configuration provider.
  * 
@@ -38,6 +41,16 @@ public interface ImportRuleConfigurationProvider<T extends RuleConfiguration> ex
      */
     void check(ShardingSphereDatabase database, T ruleConfig);
     
+    /**
+     * Get required data source names.
+     *
+     * @param ruleConfig rule configuration
+     * @return required data source names
+     */
+    default Collection<String> getRequiredDataSourceNames(T ruleConfig) {
+        return Collections.emptyList();
+    }
+    
     @Override
     Class<T> getType();
 }
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index 622af678883..cc232ad03bd 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.util;
 
-import org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
+import org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
 import org.apache.shardingsphere.distsql.handler.exception.datasource.MissingRequiredDataSourcesException;
 import org.apache.shardingsphere.distsql.handler.exception.storageunit.InvalidStorageUnitsException;
 import org.apache.shardingsphere.distsql.handler.validate.DataSourcePoolPropertiesValidator;
@@ -39,7 +39,6 @@ import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUn
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
 import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
 import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -140,9 +139,8 @@ public final class YamlDatabaseConfigurationImportExecutor {
         metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getDatabase(databaseName).getName(), ruleConfigs);
     }
     
-    @SuppressWarnings("unchecked")
     private void addRule(final Collection<RuleConfiguration> ruleConfigs, final RuleConfiguration ruleConfig, final ShardingSphereDatabase database) {
-        TypedSPILoader.findService(ImportRuleConfigurationProvider.class, ruleConfig.getClass()).ifPresent(optional -> optional.check(database, ruleConfig));
+        ImportRuleConfigurationChecker.checkRule(ruleConfig, database);
         ruleConfigs.add(ruleConfig);
         database.getRuleMetaData().getRules().add(buildRule(ruleConfig, database));
     }