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 71d286fdcce Use ResourceMetaData instead of DataSourceMap for 
DatabaseRuleBuilder (#31570)
71d286fdcce is described below

commit 71d286fdcce2fc142596d20856b304d048767f25
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Jun 3 21:08:48 2024 +0800

    Use ResourceMetaData instead of DataSourceMap for DatabaseRuleBuilder 
(#31570)
    
    * Use ResourceMetaData instead of DataSourceMap for DatabaseRuleBuilder
    
    * Use ResourceMetaData instead of DataSourceMap for DatabaseRuleBuilder
---
 .../rule/builder/BroadcastRuleBuilder.java          |  7 +++----
 .../rule/builder/BroadcastRuleBuilderTest.java      |  4 +++-
 .../encrypt/rule/builder/EncryptRuleBuilder.java    |  5 ++---
 .../rule/builder/EncryptRuleBuilderTest.java        |  4 +++-
 .../mask/rule/builder/MaskRuleBuilder.java          |  5 ++---
 .../mask/rule/builder/MaskRuleBuilderTest.java      |  4 +++-
 .../rule/builder/ReadwriteSplittingRuleBuilder.java |  5 ++---
 .../builder/ReadwriteSplittingRuleBuilderTest.java  |  3 ++-
 .../shadow/rule/builder/ShadowRuleBuilder.java      |  5 ++---
 .../shadow/rule/builder/ShadowRuleBuilderTest.java  |  4 +++-
 .../sharding/rule/builder/ShardingRuleBuilder.java  |  9 ++++-----
 .../rule/builder/ShardingRuleBuilderTest.java       |  6 +++---
 .../metadata/database/ShardingSphereDatabase.java   | 20 ++++++++++++++------
 .../database/resource/ResourceMetaData.java         |  9 +++++++++
 .../rule/builder/database/DatabaseRuleBuilder.java  |  7 +++----
 .../rule/builder/database/DatabaseRulesBuilder.java | 21 ++++++++++-----------
 .../builder/database/DatabaseRulesBuilderTest.java  |  4 +++-
 .../builder/fixture/FixtureDatabaseRuleBuilder.java |  5 ++---
 .../metadata/factory/InternalMetaDataFactory.java   |  4 +---
 .../single/rule/builder/SingleRuleBuilder.java      |  7 +++----
 .../single/rule/builder/SingleRuleBuilderTest.java  |  5 +++--
 .../mode/service/manager/ConfigurationManager.java  | 12 ++++--------
 .../mode/fixture/ModeRuleBuilderFixture.java        |  5 ++---
 .../YamlDatabaseConfigurationImportExecutor.java    |  6 +-----
 .../ImportDatabaseConfigurationExecutorTest.java    |  5 ++++-
 .../test/it/rewrite/engine/SQLRewriterIT.java       |  3 ++-
 26 files changed, 93 insertions(+), 81 deletions(-)

diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilder.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilder.java
index dce5274a4e1..8c3ce28d14f 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilder.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilder.java
@@ -22,12 +22,11 @@ import 
org.apache.shardingsphere.broadcast.constant.BroadcastOrder;
 import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Broadcast rule builder.
@@ -36,8 +35,8 @@ public final class BroadcastRuleBuilder implements 
DatabaseRuleBuilder<Broadcast
     
     @Override
     public BroadcastRule build(final BroadcastRuleConfiguration ruleConfig, 
final String databaseName, final DatabaseType protocolType,
-                               final Map<String, DataSource> dataSources, 
final Collection<ShardingSphereRule> builtRules, final 
ComputeNodeInstanceContext computeNodeInstanceContext) {
-        return new BroadcastRule(ruleConfig, databaseName, dataSources, 
builtRules);
+                               final ResourceMetaData resourceMetaData, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
+        return new BroadcastRule(ruleConfig, databaseName, 
resourceMetaData.getDataSourceMap(), builtRules);
     }
     
     @Override
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilderTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilderTest.java
index 5194ed1a623..961e1eb91ee 100644
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilderTest.java
+++ 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilderTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.broadcast.rule.builder;
 import 
org.apache.shardingsphere.broadcast.api.config.BroadcastRuleConfiguration;
 import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.test.fixture.database.MockedDatabaseType;
@@ -38,6 +39,7 @@ class BroadcastRuleBuilderTest {
     void assertBuild() {
         BroadcastRuleConfiguration ruleConfig = 
mock(BroadcastRuleConfiguration.class);
         DatabaseRuleBuilder builder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class, 
Collections.singleton(ruleConfig)).get(ruleConfig);
-        assertThat(builder.build(ruleConfig, "", new MockedDatabaseType(), 
Collections.emptyMap(), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)), instanceOf(BroadcastRule.class));
+        assertThat(builder.build(ruleConfig, "", new MockedDatabaseType(), 
mock(ResourceMetaData.class), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)),
+                instanceOf(BroadcastRule.class));
     }
 }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilder.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilder.java
index 19c3803d5a5..cd73d2078a0 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilder.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilder.java
@@ -22,12 +22,11 @@ import 
org.apache.shardingsphere.encrypt.constant.EncryptOrder;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Encrypt rule builder.
@@ -36,7 +35,7 @@ public final class EncryptRuleBuilder implements 
DatabaseRuleBuilder<EncryptRule
     
     @Override
     public EncryptRule build(final EncryptRuleConfiguration ruleConfig, final 
String databaseName, final DatabaseType protocolType,
-                             final Map<String, DataSource> dataSources, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
+                             final ResourceMetaData resourceMetaData, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
         return new EncryptRule(databaseName, ruleConfig);
     }
     
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilderTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilderTest.java
index eeb2b602de7..e9c14bf0929 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilderTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/builder/EncryptRuleBuilderTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.encrypt.rule.builder;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.test.fixture.database.MockedDatabaseType;
@@ -38,6 +39,7 @@ class EncryptRuleBuilderTest {
     void assertBuild() {
         EncryptRuleConfiguration ruleConfig = 
mock(EncryptRuleConfiguration.class);
         DatabaseRuleBuilder builder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class, 
Collections.singleton(ruleConfig)).get(ruleConfig);
-        assertThat(builder.build(ruleConfig, "", new MockedDatabaseType(), 
Collections.emptyMap(), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)), instanceOf(EncryptRule.class));
+        assertThat(builder.build(ruleConfig, "", new MockedDatabaseType(), 
mock(ResourceMetaData.class), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)),
+                instanceOf(EncryptRule.class));
     }
 }
diff --git 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilder.java
 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilder.java
index bee11e45d20..800fb44555f 100644
--- 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilder.java
+++ 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilder.java
@@ -19,15 +19,14 @@ package org.apache.shardingsphere.mask.rule.builder;
 
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.mask.api.config.MaskRuleConfiguration;
 import org.apache.shardingsphere.mask.constant.MaskOrder;
 import org.apache.shardingsphere.mask.rule.MaskRule;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Mask rule builder.
@@ -36,7 +35,7 @@ public final class MaskRuleBuilder implements 
DatabaseRuleBuilder<MaskRuleConfig
     
     @Override
     public MaskRule build(final MaskRuleConfiguration ruleConfig, final String 
databaseName, final DatabaseType protocolType,
-                          final Map<String, DataSource> dataSources, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
+                          final ResourceMetaData resourceMetaData, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
         return new MaskRule(ruleConfig);
     }
     
diff --git 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilderTest.java
 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilderTest.java
index 84c5f6676ce..771d0b5ae9d 100644
--- 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilderTest.java
+++ 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/builder/MaskRuleBuilderTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.mask.rule.builder;
 
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.mask.api.config.MaskRuleConfiguration;
@@ -38,6 +39,7 @@ class MaskRuleBuilderTest {
     void assertBuild() {
         MaskRuleConfiguration ruleConfig = mock(MaskRuleConfiguration.class);
         DatabaseRuleBuilder<MaskRuleConfiguration> builder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class, 
Collections.singleton(ruleConfig)).get(ruleConfig);
-        assertThat(builder.build(ruleConfig, "", new MySQLDatabaseType(), 
Collections.emptyMap(), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)), instanceOf(MaskRule.class));
+        assertThat(builder.build(ruleConfig, "", new MySQLDatabaseType(), 
mock(ResourceMetaData.class), Collections.emptyList(),
+                mock(ComputeNodeInstanceContext.class)), 
instanceOf(MaskRule.class));
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilder.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilder.java
index 20134d92c4f..ffc1b680447 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilder.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilder.java
@@ -19,15 +19,14 @@ package 
org.apache.shardingsphere.readwritesplitting.rule.builder;
 
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
 import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Readwrite-splitting rule builder.
@@ -36,7 +35,7 @@ public final class ReadwriteSplittingRuleBuilder implements 
DatabaseRuleBuilder<
     
     @Override
     public ReadwriteSplittingRule build(final 
ReadwriteSplittingRuleConfiguration ruleConfig, final String databaseName, 
final DatabaseType protocolType,
-                                        final Map<String, DataSource> 
dataSources, final Collection<ShardingSphereRule> builtRules, final 
ComputeNodeInstanceContext computeNodeInstanceContext) {
+                                        final ResourceMetaData 
resourceMetaData, final Collection<ShardingSphereRule> builtRules, final 
ComputeNodeInstanceContext computeNodeInstanceContext) {
         return new ReadwriteSplittingRule(databaseName, ruleConfig, 
computeNodeInstanceContext);
     }
     
diff --git 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilderTest.java
 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilderTest.java
index ab55858c3d4..b932ece50e5 100644
--- 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilderTest.java
+++ 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/builder/ReadwriteSplittingRuleBuilderTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.readwritesplitting.rule.builder;
 
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
@@ -41,6 +42,6 @@ class ReadwriteSplittingRuleBuilderTest {
                 new ReadwriteSplittingDataSourceGroupRuleConfiguration("name", 
"writeDataSourceName", Collections.singletonList("readDataSourceName"), 
"loadBalancerName")), Collections.emptyMap());
         DatabaseRuleBuilder builder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class, 
Collections.singleton(ruleConfig)).get(ruleConfig);
         assertThat(builder.build(ruleConfig, "",
-                new MockedDatabaseType(), Collections.emptyMap(), 
Collections.emptyList(), mock(ComputeNodeInstanceContext.class)), 
instanceOf(ReadwriteSplittingRule.class));
+                new MockedDatabaseType(), mock(ResourceMetaData.class), 
Collections.emptyList(), mock(ComputeNodeInstanceContext.class)), 
instanceOf(ReadwriteSplittingRule.class));
     }
 }
diff --git 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilder.java
 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilder.java
index c2088656e75..cf71ca96448 100644
--- 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilder.java
+++ 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilder.java
@@ -19,15 +19,14 @@ package org.apache.shardingsphere.shadow.rule.builder;
 
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.constant.ShadowOrder;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Shadow rule builder.
@@ -36,7 +35,7 @@ public final class ShadowRuleBuilder implements 
DatabaseRuleBuilder<ShadowRuleCo
     
     @Override
     public ShadowRule build(final ShadowRuleConfiguration ruleConfig, final 
String databaseName, final DatabaseType protocolType,
-                            final Map<String, DataSource> dataSources, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
+                            final ResourceMetaData resourceMetaData, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
         return new ShadowRule(ruleConfig);
     }
     
diff --git 
a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilderTest.java
 
b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilderTest.java
index 216d7780613..c5c9516dc0d 100644
--- 
a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilderTest.java
+++ 
b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/builder/ShadowRuleBuilderTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.shadow.rule.builder;
 
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
@@ -38,6 +39,7 @@ class ShadowRuleBuilderTest {
     void assertBuild() {
         ShadowRuleConfiguration ruleConfig = new ShadowRuleConfiguration();
         DatabaseRuleBuilder builder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class, 
Collections.singleton(ruleConfig)).get(ruleConfig);
-        assertThat(builder.build(ruleConfig, "", new MySQLDatabaseType(), 
Collections.emptyMap(), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)), instanceOf(ShadowRule.class));
+        assertThat(builder.build(ruleConfig, "", new MySQLDatabaseType(), 
mock(ResourceMetaData.class), Collections.emptyList(),
+                mock(ComputeNodeInstanceContext.class)), 
instanceOf(ShadowRule.class));
     }
 }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
index 99f1edcb498..ec7e816fbe9 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.sharding.rule.builder;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
@@ -27,9 +28,7 @@ import 
org.apache.shardingsphere.sharding.constant.ShardingOrder;
 import 
org.apache.shardingsphere.sharding.exception.metadata.MissingRequiredShardingConfigurationException;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Sharding rule builder.
@@ -38,9 +37,9 @@ public final class ShardingRuleBuilder implements 
DatabaseRuleBuilder<ShardingRu
     
     @Override
     public ShardingRule build(final ShardingRuleConfiguration ruleConfig, 
final String databaseName, final DatabaseType protocolType,
-                              final Map<String, DataSource> dataSources, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
-        ShardingSpherePreconditions.checkNotEmpty(dataSources, () -> new 
MissingRequiredShardingConfigurationException("Data source", databaseName));
-        return new ShardingRule(ruleConfig, dataSources, 
computeNodeInstanceContext);
+                              final ResourceMetaData resourceMetaData, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
+        
ShardingSpherePreconditions.checkNotEmpty(resourceMetaData.getDataSourceMap(), 
() -> new MissingRequiredShardingConfigurationException("Data source", 
databaseName));
+        return new ShardingRule(ruleConfig, 
resourceMetaData.getDataSourceMap(), computeNodeInstanceContext);
     }
     
     @Override
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
index 1d5cf08f6c0..9872e06315b 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.sharding.rule.builder;
 
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
@@ -27,7 +28,6 @@ import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import javax.sql.DataSource;
 import java.util.Collections;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -53,13 +53,13 @@ class ShardingRuleBuilderTest {
     @Test
     void assertBuild() {
         assertThat(builder.build(ruleConfig, "sharding_db", new 
MySQLDatabaseType(),
-                Collections.singletonMap("name", mock(DataSource.class, 
RETURNS_DEEP_STUBS)), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)), instanceOf(ShardingRule.class));
+                mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), 
Collections.emptyList(), mock(ComputeNodeInstanceContext.class)), 
instanceOf(ShardingRule.class));
     }
     
     @SuppressWarnings("unchecked")
     @Test
     void assertBuildWithEmptyDataSourceMap() {
         assertThrows(MissingRequiredShardingConfigurationException.class,
-                () -> builder.build(ruleConfig, "sharding_db", new 
MySQLDatabaseType(), Collections.emptyMap(), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)));
+                () -> builder.build(ruleConfig, "sharding_db", new 
MySQLDatabaseType(), mock(ResourceMetaData.class), Collections.emptyList(), 
mock(ComputeNodeInstanceContext.class)));
     }
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
index 11283907d71..a4216384d7f 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
@@ -34,8 +34,8 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
+import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 import org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager;
 
 import javax.sql.DataSource;
@@ -89,12 +89,13 @@ public final class ShardingSphereDatabase {
     public static ShardingSphereDatabase create(final String name, final 
DatabaseType protocolType, final Map<String, DatabaseType> storageTypes,
                                                 final DatabaseConfiguration 
databaseConfig, final ConfigurationProperties props,
                                                 final 
ComputeNodeInstanceContext computeNodeInstanceContext) throws SQLException {
-        Collection<ShardingSphereRule> databaseRules = 
DatabaseRulesBuilder.build(name, protocolType, databaseConfig, 
computeNodeInstanceContext);
+        ResourceMetaData resourceMetaData = 
createResourceMetaData(databaseConfig.getDataSources(), 
databaseConfig.getStorageUnits());
+        Collection<ShardingSphereRule> databaseRules = 
DatabaseRulesBuilder.build(name, protocolType, databaseConfig, 
computeNodeInstanceContext, resourceMetaData);
         Map<String, ShardingSphereSchema> schemas = new 
ConcurrentHashMap<>(GenericSchemaBuilder
                 .build(new GenericSchemaBuilderMaterial(protocolType, 
storageTypes, DataSourceStateManager.getInstance().getEnabledDataSources(name, 
databaseConfig), databaseRules,
                         props, new 
DatabaseTypeRegistry(protocolType).getDefaultSchemaName(name))));
         SystemSchemaBuilder.build(name, protocolType, 
props).forEach(schemas::putIfAbsent);
-        return create(name, protocolType, databaseConfig, databaseRules, 
schemas);
+        return create(name, protocolType, databaseRules, schemas, 
resourceMetaData);
     }
     
     /**
@@ -107,7 +108,8 @@ public final class ShardingSphereDatabase {
      */
     public static ShardingSphereDatabase create(final String name, final 
DatabaseType protocolType, final ConfigurationProperties props) {
         DatabaseConfiguration databaseConfig = new 
DataSourceProvidedDatabaseConfiguration(new LinkedHashMap<>(), new 
LinkedList<>());
-        return create(name, protocolType, databaseConfig, new LinkedList<>(), 
SystemSchemaBuilder.build(name, protocolType, props));
+        ResourceMetaData resourceMetaData = 
createResourceMetaData(databaseConfig.getDataSources(), 
databaseConfig.getStorageUnits());
+        return create(name, protocolType, new LinkedList<>(), 
SystemSchemaBuilder.build(name, protocolType, props), resourceMetaData);
     }
     
     /**
@@ -116,13 +118,19 @@ public final class ShardingSphereDatabase {
      * @param name database name
      * @param protocolType database protocol type
      * @param databaseConfig database configuration
-     * @param rules rules
+     * @param computeNodeInstanceContext compute node instance context
      * @param schemas schemas
      * @return database meta data
      */
     public static ShardingSphereDatabase create(final String name, final 
DatabaseType protocolType, final DatabaseConfiguration databaseConfig,
-                                                final 
Collection<ShardingSphereRule> rules, final Map<String, ShardingSphereSchema> 
schemas) {
+                                                final 
ComputeNodeInstanceContext computeNodeInstanceContext, final Map<String, 
ShardingSphereSchema> schemas) {
         ResourceMetaData resourceMetaData = 
createResourceMetaData(databaseConfig.getDataSources(), 
databaseConfig.getStorageUnits());
+        Collection<ShardingSphereRule> rules = 
DatabaseRulesBuilder.build(name, protocolType, databaseConfig, 
computeNodeInstanceContext, resourceMetaData);
+        return create(name, protocolType, rules, schemas, resourceMetaData);
+    }
+    
+    private static ShardingSphereDatabase create(final String name, final 
DatabaseType protocolType, final Collection<ShardingSphereRule> rules,
+                                                 final Map<String, 
ShardingSphereSchema> schemas, final ResourceMetaData resourceMetaData) {
         RuleMetaData ruleMetaData = new RuleMetaData(rules);
         return new ShardingSphereDatabase(name, protocolType, 
resourceMetaData, ruleMetaData, schemas);
     }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/ResourceMetaData.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/ResourceMetaData.java
index 97962e66f60..d999eb4a7c8 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/ResourceMetaData.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/ResourceMetaData.java
@@ -84,4 +84,13 @@ public final class ResourceMetaData {
     public Collection<String> getNotExistedDataSources(final 
Collection<String> resourceNames) {
         return resourceNames.stream().filter(each -> 
!storageUnits.containsKey(each)).collect(Collectors.toSet());
     }
+    
+    /**
+     * Get data source map.
+     *
+     * @return data source map
+     */
+    public Map<String, DataSource> getDataSourceMap() {
+        return 
storageUnits.entrySet().stream().collect(Collectors.toMap(Entry::getKey, entry 
-> entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new));
+    }
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRuleBuilder.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRuleBuilder.java
index 550319ed8da..66f24a6891e 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRuleBuilder.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRuleBuilder.java
@@ -20,14 +20,13 @@ package 
org.apache.shardingsphere.infra.rule.builder.database;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.RuleBuilder;
 import org.apache.shardingsphere.infra.rule.scope.DatabaseRule;
 import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Database rule builder.
@@ -43,11 +42,11 @@ public interface DatabaseRuleBuilder<T extends 
RuleConfiguration> extends RuleBu
      * @param ruleConfig rule configuration
      * @param databaseName database name
      * @param protocolType protocol type
-     * @param dataSources data sources
+     * @param resourceMetaData resource meta data
      * @param builtRules built rules
      * @param computeNodeInstanceContext compute node instance context
      * @return built database rule
      */
     DatabaseRule build(T ruleConfig, String databaseName, DatabaseType 
protocolType,
-                       Map<String, DataSource> dataSources, 
Collection<ShardingSphereRule> builtRules, ComputeNodeInstanceContext 
computeNodeInstanceContext);
+                       ResourceMetaData resourceMetaData, 
Collection<ShardingSphereRule> builtRules, ComputeNodeInstanceContext 
computeNodeInstanceContext);
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
index 9c6b28a5ac4..11e8e948789 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilder.java
@@ -26,10 +26,10 @@ import 
org.apache.shardingsphere.infra.config.rule.function.DistributedRuleConfi
 import 
org.apache.shardingsphere.infra.config.rule.function.EnhancedRuleConfiguration;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 
-import javax.sql.DataSource;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -53,21 +53,20 @@ public final class DatabaseRulesBuilder {
      * @param protocolType protocol type
      * @param databaseConfig database configuration
      * @param computeNodeInstanceContext compute node instance context
+     * @param resourceMetaData  resource meta data
      * @return built rules
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
     public static Collection<ShardingSphereRule> build(final String 
databaseName, final DatabaseType protocolType, final DatabaseConfiguration 
databaseConfig,
-                                                       final 
ComputeNodeInstanceContext computeNodeInstanceContext) {
+                                                       final 
ComputeNodeInstanceContext computeNodeInstanceContext, final ResourceMetaData 
resourceMetaData) {
         Collection<ShardingSphereRule> result = new LinkedList<>();
         for (Entry<RuleConfiguration, DatabaseRuleBuilder> entry : 
getRuleBuilderMap(databaseConfig).entrySet()) {
-            Map<String, DataSource> dataSources = 
databaseConfig.getStorageUnits().entrySet().stream()
-                    .collect(Collectors.toMap(Entry::getKey, storageUnit -> 
storageUnit.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new));
             RuleConfigurationChecker configChecker = 
OrderedSPILoader.getServicesByClass(
                     RuleConfigurationChecker.class, 
Collections.singleton(entry.getKey().getClass())).get(entry.getKey().getClass());
             if (null != configChecker) {
-                configChecker.check(databaseName, entry.getKey(), dataSources, 
result);
+                configChecker.check(databaseName, entry.getKey(), 
resourceMetaData.getDataSourceMap(), result);
             }
-            result.add(entry.getValue().build(entry.getKey(), databaseName, 
protocolType, dataSources, result, computeNodeInstanceContext));
+            result.add(entry.getValue().build(entry.getKey(), databaseName, 
protocolType, resourceMetaData, result, computeNodeInstanceContext));
         }
         return result;
     }
@@ -77,24 +76,24 @@ public final class DatabaseRulesBuilder {
      *
      * @param databaseName database name
      * @param protocolType protocol type
-     * @param dataSources data sources
      * @param rules rules
      * @param ruleConfig rule configuration
      * @param computeNodeInstanceContext compute node instance context
+     * @param resourceMetaData  resource meta data
      * @return built rules
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public static Collection<ShardingSphereRule> build(final String 
databaseName, final DatabaseType protocolType, final Map<String, DataSource> 
dataSources,
-                                                       final 
Collection<ShardingSphereRule> rules, final RuleConfiguration ruleConfig, final 
ComputeNodeInstanceContext computeNodeInstanceContext) {
+    public static Collection<ShardingSphereRule> build(final String 
databaseName, final DatabaseType protocolType, final 
Collection<ShardingSphereRule> rules, final RuleConfiguration ruleConfig,
+                                                       final 
ComputeNodeInstanceContext computeNodeInstanceContext, final ResourceMetaData 
resourceMetaData) {
         Collection<ShardingSphereRule> result = new LinkedList<>();
         for (Entry<RuleConfiguration, DatabaseRuleBuilder> entry : 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class,
                 Collections.singletonList(ruleConfig), 
Comparator.reverseOrder()).entrySet()) {
             RuleConfigurationChecker configChecker = 
OrderedSPILoader.getServicesByClass(
                     RuleConfigurationChecker.class, 
Collections.singleton(entry.getKey().getClass())).get(entry.getKey().getClass());
             if (null != configChecker) {
-                configChecker.check(databaseName, entry.getKey(), dataSources, 
rules);
+                configChecker.check(databaseName, entry.getKey(), 
resourceMetaData.getDataSourceMap(), rules);
             }
-            result.add(entry.getValue().build(entry.getKey(), databaseName, 
protocolType, dataSources, rules, computeNodeInstanceContext));
+            result.add(entry.getValue().build(entry.getKey(), databaseName, 
protocolType, resourceMetaData, rules, computeNodeInstanceContext));
         }
         return result;
     }
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilderTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilderTest.java
index d5189f2d492..39cc139e3f9 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilderTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/database/DatabaseRulesBuilderTest.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.fixture.FixtureRule;
 import org.apache.shardingsphere.infra.fixture.FixtureRuleConfiguration;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.junit.jupiter.api.Test;
 
@@ -38,7 +39,8 @@ class DatabaseRulesBuilderTest {
     @Test
     void assertBuild() {
         Iterator<ShardingSphereRule> actual = 
DatabaseRulesBuilder.build("foo_db", new MySQLDatabaseType(),
-                new 
DataSourceProvidedDatabaseConfiguration(Collections.emptyMap(), 
Collections.singleton(new FixtureRuleConfiguration())), 
mock(ComputeNodeInstanceContext.class)).iterator();
+                new 
DataSourceProvidedDatabaseConfiguration(Collections.emptyMap(), 
Collections.singleton(new FixtureRuleConfiguration())), 
mock(ComputeNodeInstanceContext.class),
+                mock(ResourceMetaData.class)).iterator();
         assertThat(actual.next(), instanceOf(FixtureRule.class));
         assertFalse(actual.hasNext());
     }
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/fixture/FixtureDatabaseRuleBuilder.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/fixture/FixtureDatabaseRuleBuilder.java
index f1c53629b61..942669660e2 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/fixture/FixtureDatabaseRuleBuilder.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/fixture/FixtureDatabaseRuleBuilder.java
@@ -20,18 +20,17 @@ package 
org.apache.shardingsphere.infra.rule.builder.fixture;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.fixture.FixtureRule;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 public final class FixtureDatabaseRuleBuilder implements 
DatabaseRuleBuilder<FixtureDatabaseRuleConfiguration> {
     
     @Override
     public FixtureRule build(final FixtureDatabaseRuleConfiguration 
ruleConfig, final String databaseName, final DatabaseType protocolType,
-                             final Map<String, DataSource> dataSources, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
+                             final ResourceMetaData resourceMetaData, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
         return new FixtureRule();
     }
     
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
index e838f9ece72..b12e59cca40 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
@@ -25,7 +25,6 @@ import 
org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 
 import java.util.Map;
@@ -51,8 +50,7 @@ public final class InternalMetaDataFactory {
     public static ShardingSphereDatabase create(final String databaseName, 
final MetaDataPersistService persistService, final DatabaseConfiguration 
databaseConfig,
                                                 final ConfigurationProperties 
props, final ComputeNodeInstanceContext computeNodeInstanceContext) {
         DatabaseType protocolType = 
DatabaseTypeEngine.getProtocolType(databaseName, databaseConfig, props);
-        return ShardingSphereDatabase.create(databaseName, protocolType, 
databaseConfig, DatabaseRulesBuilder.build(databaseName, protocolType, 
databaseConfig, computeNodeInstanceContext),
-                
persistService.getDatabaseMetaDataService().loadSchemas(databaseName));
+        return ShardingSphereDatabase.create(databaseName, protocolType, 
databaseConfig, computeNodeInstanceContext, 
persistService.getDatabaseMetaDataService().loadSchemas(databaseName));
     }
     
     /**
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilder.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilder.java
index 79c381127c5..b2604a2d168 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilder.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilder.java
@@ -19,15 +19,14 @@ package org.apache.shardingsphere.single.rule.builder;
 
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
 import org.apache.shardingsphere.single.constant.SingleOrder;
 import org.apache.shardingsphere.single.rule.SingleRule;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * Single rule builder.
@@ -36,8 +35,8 @@ public final class SingleRuleBuilder implements 
DatabaseRuleBuilder<SingleRuleCo
     
     @Override
     public SingleRule build(final SingleRuleConfiguration ruleConfig, final 
String databaseName, final DatabaseType protocolType,
-                            final Map<String, DataSource> dataSources, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
-        return new SingleRule(ruleConfig, databaseName, protocolType, 
dataSources, builtRules);
+                            final ResourceMetaData resourceMetaData, final 
Collection<ShardingSphereRule> builtRules, final ComputeNodeInstanceContext 
computeNodeInstanceContext) {
+        return new SingleRule(ruleConfig, databaseName, protocolType, 
resourceMetaData.getDataSourceMap(), builtRules);
     }
     
     @Override
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java
index a3ebc5b9c4f..5143207f5c1 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.single.rule.builder;
 
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.rule.scope.DatabaseRule;
@@ -41,7 +42,7 @@ class SingleRuleBuilderTest {
     void assertBuild() {
         DatabaseRuleBuilder builder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class).iterator().next();
         DatabaseRule actual = 
builder.build(mock(SingleRuleConfiguration.class), "",
-                new MySQLDatabaseType(), Collections.emptyMap(), 
Collections.singleton(mock(ShardingSphereRule.class, RETURNS_DEEP_STUBS)), 
mock(ComputeNodeInstanceContext.class));
+                new MySQLDatabaseType(), mock(ResourceMetaData.class), 
Collections.singleton(mock(ShardingSphereRule.class, RETURNS_DEEP_STUBS)), 
mock(ComputeNodeInstanceContext.class));
         assertThat(actual, instanceOf(SingleRule.class));
     }
     
@@ -49,7 +50,7 @@ class SingleRuleBuilderTest {
     @Test
     void assertBuildWithDefaultDataSource() {
         DatabaseRuleBuilder builder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class).iterator().next();
-        DatabaseRule actual = builder.build(new 
SingleRuleConfiguration(Collections.emptyList(), "foo_ds"), "", new 
MySQLDatabaseType(), Collections.emptyMap(),
+        DatabaseRule actual = builder.build(new 
SingleRuleConfiguration(Collections.emptyList(), "foo_ds"), "", new 
MySQLDatabaseType(), mock(ResourceMetaData.class),
                 Collections.singleton(mock(ShardingSphereRule.class, 
RETURNS_DEEP_STUBS)), mock(ComputeNodeInstanceContext.class));
         assertThat(actual, instanceOf(SingleRule.class));
     }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/ConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/ConfigurationManager.java
index d90a65a6c69..7210969eaaa 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/ConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/ConfigurationManager.java
@@ -169,10 +169,8 @@ public final class ConfigurationManager {
         }
         try {
             rules.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
-            rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getProtocolType(),
-                    
database.getResourceMetaData().getStorageUnits().entrySet().stream()
-                            .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new)),
-                    database.getRuleMetaData().getRules(), ruleConfig, 
computeNodeInstanceContext));
+            rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getProtocolType(), database.getRuleMetaData().getRules(),
+                    ruleConfig, computeNodeInstanceContext, 
database.getResourceMetaData()));
             refreshMetadata(databaseName, database, rules, false);
         } catch (final SQLException ex) {
             log.error("Alter database: {} rule configurations failed", 
databaseName, ex);
@@ -197,10 +195,8 @@ public final class ConfigurationManager {
         try {
             rules.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
             if (!((DatabaseRuleConfiguration) ruleConfig).isEmpty()) {
-                rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getProtocolType(),
-                        
database.getResourceMetaData().getStorageUnits().entrySet().stream()
-                                .collect(Collectors.toMap(Entry::getKey, entry 
-> entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new)),
-                        database.getRuleMetaData().getRules(), ruleConfig, 
computeNodeInstanceContext));
+                rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getProtocolType(), database.getRuleMetaData().getRules(),
+                        ruleConfig, computeNodeInstanceContext, 
database.getResourceMetaData()));
             }
             refreshMetadata(databaseName, database, rules, true);
         } catch (final SQLException ex) {
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/ModeRuleBuilderFixture.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/ModeRuleBuilderFixture.java
index f07811cae60..8735e407767 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/ModeRuleBuilderFixture.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/ModeRuleBuilderFixture.java
@@ -19,17 +19,16 @@ package org.apache.shardingsphere.mode.fixture;
 
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 
-import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Map;
 
 public final class ModeRuleBuilderFixture implements 
DatabaseRuleBuilder<ModeRuleConfigurationFixture> {
     
     @Override
-    public ModeRuleFixture build(final ModeRuleConfigurationFixture 
ruleConfig, final String databaseName, final DatabaseType databaseType, final 
Map<String, DataSource> dataSources,
+    public ModeRuleFixture build(final ModeRuleConfigurationFixture 
ruleConfig, final String databaseName, final DatabaseType databaseType, final 
ResourceMetaData resourceMetaData,
                                  final Collection<ShardingSphereRule> 
builtRules, final ComputeNodeInstanceContext computeNodeInstanceContext) {
         return new ModeRuleFixture();
     }
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 565d8d7737e..2f2b4201e36 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
@@ -48,7 +48,6 @@ import 
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConf
 import 
org.apache.shardingsphere.proxy.backend.config.yaml.swapper.YamlProxyDataSourceConfigurationSwapper;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 
-import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
@@ -58,7 +57,6 @@ import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TreeMap;
-import java.util.stream.Collectors;
 
 /**
  * Yaml database configuration import executor.
@@ -143,10 +141,8 @@ public final class YamlDatabaseConfigurationImportExecutor 
{
     @SuppressWarnings({"unchecked", "rawtypes"})
     private ShardingSphereRule buildRule(final RuleConfiguration ruleConfig, 
final ShardingSphereDatabase database) {
         DatabaseRuleBuilder ruleBuilder = 
OrderedSPILoader.getServices(DatabaseRuleBuilder.class, 
Collections.singleton(ruleConfig)).get(ruleConfig);
-        Map<String, DataSource> dataSources = 
database.getResourceMetaData().getStorageUnits().entrySet().stream()
-                .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new));
         ComputeNodeInstanceContext computeNodeInstanceContext = 
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext();
-        return ruleBuilder.build(ruleConfig, database.getName(), 
database.getProtocolType(), dataSources, database.getRuleMetaData().getRules(), 
computeNodeInstanceContext);
+        return ruleBuilder.build(ruleConfig, database.getName(), 
database.getProtocolType(), database.getResourceMetaData(), 
database.getRuleMetaData().getRules(), computeNodeInstanceContext);
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
index 04bf0fee7e6..17177580d9c 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
@@ -48,6 +48,7 @@ import org.mockito.internal.configuration.plugins.Plugins;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
 
+import javax.sql.DataSource;
 import java.net.URL;
 import java.sql.SQLException;
 import java.util.Collections;
@@ -146,8 +147,10 @@ class ImportDatabaseConfigurationExecutorTest {
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         
when(database.getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
         StorageUnit storageUnit = mock(StorageUnit.class);
-        when(storageUnit.getDataSource()).thenReturn(new MockedDataSource());
+        DataSource dataSource = new MockedDataSource();
+        when(storageUnit.getDataSource()).thenReturn(dataSource);
         when(database.getResourceMetaData().getStorageUnits()).thenReturn(new 
HashMap<>(Collections.singletonMap("foo_ds", storageUnit)));
+        
when(database.getResourceMetaData().getDataSourceMap()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
         
when(database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
         
when(result.getMetaDataContexts().getMetaData().getDatabases()).thenReturn(Collections.singletonMap(databaseName,
 database));
         
when(result.getMetaDataContexts().getMetaData().getDatabase(databaseName)).thenReturn(database);
diff --git 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
index 7d61b2eef7b..fc0d5b1addf 100644
--- 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
+++ 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
@@ -160,7 +160,8 @@ public abstract class SQLRewriterIT {
     }
     
     private Collection<ShardingSphereRule> createDatabaseRules(final 
DatabaseConfiguration databaseConfig, final String schemaName, final 
SQLStatement sqlStatement, final DatabaseType databaseType) {
-        Collection<ShardingSphereRule> result = 
DatabaseRulesBuilder.build(DefaultDatabase.LOGIC_NAME, databaseType, 
databaseConfig, mock(ComputeNodeInstanceContext.class));
+        Collection<ShardingSphereRule> result = 
DatabaseRulesBuilder.build(DefaultDatabase.LOGIC_NAME, databaseType, 
databaseConfig, mock(ComputeNodeInstanceContext.class),
+                new ResourceMetaData(databaseConfig.getDataSources(), 
databaseConfig.getStorageUnits()));
         mockRules(result, schemaName, sqlStatement);
         result.add(sqlParserRule);
         result.add(timestampServiceRule);

Reply via email to