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

totalo 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 3ad843a8abe Remove ResourceMetaData.getDataSources() (#28149)
3ad843a8abe is described below

commit 3ad843a8abe033a1dbbd5bc93b8b77b599169535
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Aug 18 01:08:32 2023 +0800

    Remove ResourceMetaData.getDataSources() (#28149)
---
 .../impl/proxy/ProxyMetaDataInfoExporter.java      |  2 +-
 .../impl/proxy/ProxyMetaDataInfoExporterTest.java  |  4 ++--
 .../update/CreateEncryptRuleStatementUpdater.java  |  2 +-
 .../ReadwriteSplittingRuleStatementChecker.java    |  4 ++--
 ...ReadwriteSplittingRuleStatementUpdaterTest.java |  6 ++++--
 .../data/ShardingStatisticsTableCollector.java     |  3 ++-
 .../infra/metadata/ShardingSphereMetaData.java     |  3 ++-
 .../metadata/database/ShardingSphereDatabase.java  |  6 +++---
 .../database/resource/ResourceMetaData.java        |  9 ---------
 .../ShardingSphereTableDataCollectorUtils.java     |  2 +-
 .../infra/metadata/ShardingSphereMetaDataTest.java |  7 ++++---
 .../table/AlterTableStatementSchemaRefresher.java  |  2 +-
 .../table/CreateTableStatementSchemaRefresher.java |  2 +-
 .../table/RenameTableStatementSchemaRefresher.java |  2 +-
 .../view/AlterViewStatementSchemaRefresher.java    |  2 +-
 .../view/CreateViewStatementSchemaRefresher.java   |  2 +-
 .../route/engine/impl/AllSQLRouteExecutor.java     |  2 +-
 .../route/engine/impl/PartialSQLRouteExecutor.java |  6 +++---
 .../route/engine/AllSQLRouteExecutorTest.java      |  2 +-
 .../engine/impl/PartialSQLRouteExecutorTest.java   |  2 +-
 .../globalclock/core/rule/GlobalClockRule.java     |  4 ++--
 .../factory/ExternalMetaDataFactoryTest.java       |  6 +++---
 .../single/route/SingleSQLRouter.java              |  4 ++--
 .../single/route/SingleSQLRouterTest.java          |  7 ++++---
 .../query/ShowUnloadedSingleTableExecutor.java     |  3 ++-
 .../update/LoadSingleTableStatementUpdater.java    |  3 ++-
 ...aultSingleTableStorageUnitStatementUpdater.java |  2 +-
 .../transaction/rule/TransactionRule.java          |  2 +-
 .../transaction/rule/TransactionRuleTest.java      | 23 +++++++++++-----------
 .../rule/builder/TransactionRuleBuilderTest.java   |  2 +-
 .../mode/manager/ContextManager.java               |  8 ++++----
 .../context/ConfigurationContextManager.java       |  6 ++++--
 .../mode/metadata/MetaDataContextsFactory.java     |  2 +-
 .../mode/metadata/NewMetaDataContextsFactory.java  |  2 +-
 .../mode/manager/ContextManagerTest.java           | 10 +++++-----
 .../ProcessListChangedSubscriberTest.java          |  2 +-
 .../ConfigurationChangedSubscriberTest.java        |  2 +-
 .../ResourceMetaDataChangedSubscriberTest.java     |  4 +---
 .../subscriber/StateChangedSubscriberTest.java     |  7 ++-----
 .../jdbc/datasource/JDBCBackendDataSource.java     |  3 ++-
 .../executor/AbstractDatabaseMetaDataExecutor.java |  2 +-
 .../ral/queryable/ExportStorageNodesExecutor.java  |  2 +-
 .../rdl/rule/NewRuleDefinitionBackendHandler.java  |  3 ++-
 .../rdl/rule/RuleDefinitionBackendHandler.java     |  3 ++-
 .../unit/AlterStorageUnitBackendHandler.java       |  4 ++--
 .../unit/UnregisterStorageUnitBackendHandler.java  |  5 +++--
 .../rql/rule/ShowRulesUsedStorageUnitExecutor.java |  2 +-
 .../rql/storage/unit/ShowStorageUnitExecutor.java  |  9 +++++----
 .../YamlDatabaseConfigurationImportExecutor.java   | 12 ++++++-----
 .../jdbc/datasource/JDBCBackendDataSourceTest.java |  2 +-
 .../DatabaseOperateBackendHandlerFactoryTest.java  |  1 -
 .../distsql/DistSQLBackendHandlerFactoryTest.java  |  1 -
 .../queryable/ExportStorageNodesExecutorTest.java  |  4 ++--
 .../ImportDatabaseConfigurationUpdaterTest.java    |  5 +++++
 .../ral/updatable/ImportMetaDataUpdaterTest.java   |  2 +-
 .../unit/AlterStorageUnitBackendHandlerTest.java   |  8 ++++----
 .../UnregisterStorageUnitBackendHandlerTest.java   | 12 +++++------
 .../SelectInformationSchemataExecutor.java         |  3 ++-
 .../proxy/version/ShardingSphereProxyVersion.java  |  3 ++-
 .../version/ShardingSphereProxyVersionTest.java    |  4 ++--
 .../test/it/rewrite/engine/SQLRewriterIT.java      |  3 ++-
 61 files changed, 135 insertions(+), 127 deletions(-)

diff --git 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporter.java
 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporter.java
index 0df0998371b..19bd583fe30 100644
--- 
a/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporter.java
+++ 
b/agent/plugins/metrics/core/src/main/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporter.java
@@ -53,6 +53,6 @@ public final class ProxyMetaDataInfoExporter implements 
MetricsExporter {
     }
     
     private int getStorageUnitCount(final MetaDataContexts metaDataContexts) {
-        return 
metaDataContexts.getMetaData().getDatabases().values().stream().map(each -> 
each.getResourceMetaData().getDataSources().size()).reduce(0, Integer::sum);
+        return 
metaDataContexts.getMetaData().getDatabases().values().stream().map(each -> 
each.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().size()).reduce(0,
 Integer::sum);
     }
 }
diff --git 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
index c62991a5227..f26162ba87d 100644
--- 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
+++ 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/exporter/impl/proxy/ProxyMetaDataInfoExporterTest.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.agent.plugin.metrics.core.fixture.collector.Met
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.storage.StorageUnit;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -36,7 +37,6 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
-import javax.sql.DataSource;
 import java.util.Collections;
 import java.util.Optional;
 
@@ -75,7 +75,7 @@ class ProxyMetaDataInfoExporterTest {
     
     private ContextManager mockContextManager() {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(database.getResourceMetaData().getDataSources()).thenReturn(Collections.singletonMap("ds_0",
 mock(DataSource.class)));
+        
when(database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
 mock(StorageUnit.class)));
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
         
when(metaData.getDatabases()).thenReturn(Collections.singletonMap("sharding_db",
 database));
diff --git 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdater.java
 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdater.java
index b76ce9a2328..18fe7e02286 100644
--- 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdater.java
+++ 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdater.java
@@ -100,7 +100,7 @@ public final class CreateEncryptRuleStatementUpdater 
implements RuleDefinitionCr
     }
     
     private void checkDataSources(final ShardingSphereDatabase database) {
-        
ShardingSpherePreconditions.checkState(!database.getResourceMetaData().getDataSources().isEmpty(),
 () -> new EmptyStorageUnitException(database.getName()));
+        
ShardingSpherePreconditions.checkState(!database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().isEmpty(),
 () -> new EmptyStorageUnitException(database.getName()));
     }
     
     @Override
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
index 86998457671..2ade1dc5973 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
@@ -126,8 +126,8 @@ public final class ReadwriteSplittingRuleStatementChecker {
     private static void checkDuplicateRuleNamesWithExistsDataSources(final 
ShardingSphereDatabase database, final 
Collection<ReadwriteSplittingRuleSegment> segments) {
         Collection<String> currentRuleNames = new HashSet<>();
         ResourceMetaData resourceMetaData = database.getResourceMetaData();
-        if (null != resourceMetaData && null != 
resourceMetaData.getDataSources()) {
-            
currentRuleNames.addAll(resourceMetaData.getDataSources().keySet());
+        if (null != resourceMetaData && null != 
resourceMetaData.getStorageUnitMetaData().getStorageUnits()) {
+            
currentRuleNames.addAll(resourceMetaData.getStorageUnitMetaData().getStorageUnits().keySet());
         }
         currentRuleNames.addAll(getLogicDataSources(database));
         Collection<String> toBeCreatedRuleNames = 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
diff --git 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdaterTest.java
 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdaterTest.java
index 3da19a8b5ac..c2ccbdc0e72 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdaterTest.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdaterTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRe
 import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.storage.StorageUnitMetaData;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
@@ -67,18 +68,19 @@ class CreateReadwriteSplittingRuleStatementUpdaterTest {
     @BeforeEach
     void before() {
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
+        
when(resourceMetaData.getStorageUnitMetaData()).thenReturn(mock(StorageUnitMetaData.class));
         
when(database.getRuleMetaData().findRules(DataSourceContainedRule.class)).thenReturn(Collections.emptyList());
     }
     
     @Test
     void assertCheckSQLStatementWithDuplicateRuleNames() {
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.emptyMap());
+        
when(resourceMetaData.getStorageUnitMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
         assertThrows(DuplicateRuleException.class, () -> 
updater.checkSQLStatement(database, createSQLStatement("TEST"), 
createCurrentRuleConfiguration()));
     }
     
     @Test
     void assertCheckSQLStatementWithDuplicateResource() {
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("write_ds",
 null));
+        
when(resourceMetaData.getStorageUnitMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("write_ds",
 null));
         assertThrows(InvalidRuleConfigurationException.class, () -> 
updater.checkSQLStatement(database, createSQLStatement("write_ds", "TEST"), 
createCurrentRuleConfiguration()));
     }
     
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
index 210c7b3b721..349e989d36a 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
@@ -81,7 +81,8 @@ public final class ShardingStatisticsTableCollector 
implements ShardingSphereSta
                 row.add(each.getLogicTable());
                 row.add(dataNode.getDataSourceName());
                 row.add(dataNode.getTableName());
-                
addTableRowsAndDataLength(shardingSphereDatabase.getResourceMetaData().getStorageTypes(),
 shardingSphereDatabase.getResourceMetaData().getDataSources(), dataNode, row);
+                
addTableRowsAndDataLength(shardingSphereDatabase.getResourceMetaData().getStorageTypes(),
+                        
shardingSphereDatabase.getResourceMetaData().getStorageUnitMetaData().getDataSources(),
 dataNode, row);
                 tableData.getRows().add(new ShardingSphereRowData(row));
             }
         }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
index 7b9f6113418..f0c73d75af9 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
@@ -122,6 +122,7 @@ public final class ShardingSphereMetaData {
         globalRuleMetaData.findRules(ResourceHeldRule.class).forEach(each -> 
each.closeStaleResource(databaseName));
         
database.getRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> 
each.closeStaleResource(databaseName));
         
database.getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class).ifPresent(StaticDataSourceContainedRule::cleanStorageNodeDataSources);
-        Optional.ofNullable(database.getResourceMetaData()).ifPresent(optional 
-> optional.getDataSources().values().forEach(each -> 
database.getResourceMetaData().close(each)));
+        Optional.ofNullable(database.getResourceMetaData())
+                .ifPresent(optional -> 
optional.getStorageUnitMetaData().getDataSources().values().forEach(each -> 
database.getResourceMetaData().close(each)));
     }
 }
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 e7feac8f27f..7c1a3f85461 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
@@ -172,7 +172,7 @@ public final class ShardingSphereDatabase {
      * @return is completed or not
      */
     public boolean isComplete() {
-        return !ruleMetaData.getRules().isEmpty() && 
!resourceMetaData.getDataSources().isEmpty();
+        return !ruleMetaData.getRules().isEmpty() && 
!resourceMetaData.getStorageUnitMetaData().getStorageUnits().isEmpty();
     }
     
     /**
@@ -181,7 +181,7 @@ public final class ShardingSphereDatabase {
      * @return contains data source or not
      */
     public boolean containsDataSource() {
-        return !resourceMetaData.getDataSources().isEmpty();
+        return 
!resourceMetaData.getStorageUnitMetaData().getStorageUnits().isEmpty();
     }
     
     /**
@@ -195,7 +195,7 @@ public final class ShardingSphereDatabase {
         Collection<ShardingSphereRule> databaseRules = new 
LinkedList<>(ruleMetaData.getRules());
         toBeReloadedRules.stream().findFirst().ifPresent(optional -> {
             databaseRules.removeAll(toBeReloadedRules);
-            databaseRules.add(((MutableDataNodeRule) 
optional).reloadRule(ruleConfig, name, resourceMetaData.getDataSources(), 
databaseRules));
+            databaseRules.add(((MutableDataNodeRule) 
optional).reloadRule(ruleConfig, name, 
resourceMetaData.getStorageUnitMetaData().getDataSources(), databaseRules));
         });
         ruleMetaData.getRules().clear();
         ruleMetaData.getRules().addAll(databaseRules);
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 c8fc7350ea3..c892b29af07 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
@@ -64,15 +64,6 @@ public final class ResourceMetaData {
         storageUnitMetaData = new StorageUnitMetaData(databaseName, 
storageNodeDataSources, propsMap, storageResource.getStorageUnitNodeMappers());
     }
     
-    /**
-     * Get data sources.
-     *
-     * @return data sources
-     */
-    public Map<String, DataSource> getDataSources() {
-        return storageUnitMetaData.getDataSources();
-    }
-    
     /**
      * Get storage types.
      *
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/collector/ShardingSphereTableDataCollectorUtils.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/collector/ShardingSphereTableDataCollectorUtils.java
index 1ef6f48fc67..b3413d095fa 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/collector/ShardingSphereTableDataCollectorUtils.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/collector/ShardingSphereTableDataCollectorUtils.java
@@ -57,7 +57,7 @@ public final class ShardingSphereTableDataCollectorUtils {
             return Collections.emptyList();
         }
         Collection<ShardingSphereRowData> result = new LinkedList<>();
-        for (DataSource each : 
shardingSphereDatabase.getResourceMetaData().getDataSources().values()) {
+        for (DataSource each : 
shardingSphereDatabase.getResourceMetaData().getStorageUnitMetaData().getDataSources().values())
 {
             try (
                     Connection connection = each.getConnection();
                     Statement statement = connection.createStatement();
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
index bee8ad614de..4ddea502a4d 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
@@ -45,6 +45,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -57,7 +58,7 @@ class ShardingSphereMetaDataTest {
     @Test
     void assertAddDatabase() {
         ResourceHeldRule<?> globalResourceHeldRule = 
mock(ResourceHeldRule.class);
-        ShardingSphereDatabase database = 
mockDatabase(mock(ResourceMetaData.class), new MockedDataSource(), 
mock(ResourceHeldRule.class));
+        ShardingSphereDatabase database = 
mockDatabase(mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), new 
MockedDataSource(), mock(ResourceHeldRule.class));
         DatabaseType databaseType = mock(DatabaseType.class);
         ConfigurationProperties configProps = new ConfigurationProperties(new 
Properties());
         when(ShardingSphereDatabase.create("foo_db", databaseType, 
configProps)).thenReturn(database);
@@ -71,7 +72,7 @@ class ShardingSphereMetaDataTest {
     
     @Test
     void assertDropDatabase() {
-        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         DataSource dataSource = new MockedDataSource();
         ResourceHeldRule<?> databaseResourceHeldRule = 
mock(ResourceHeldRule.class);
         ResourceHeldRule<?> globalResourceHeldRule = 
mock(ResourceHeldRule.class);
@@ -88,7 +89,7 @@ class ShardingSphereMetaDataTest {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
         when(result.getName()).thenReturn("foo_db");
         when(result.getResourceMetaData()).thenReturn(resourceMetaData);
-        
when(result.getResourceMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_db",
 dataSource));
+        
when(result.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_db",
 dataSource));
         when(result.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.singleton(databaseResourceHeldRule)));
         return result;
     }
diff --git 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/AlterTableStatementSchemaRefresher.java
 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/AlterTableStatementSchemaRefresher.java
index 2819cc02d62..828a3400604 100644
--- 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/AlterTableStatementSchemaRefresher.java
+++ 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/AlterTableStatementSchemaRefresher.java
@@ -66,7 +66,7 @@ public final class AlterTableStatementSchemaRefresher 
implements MetaDataRefresh
             ruleMetaData.findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
         }
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(),
-                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getDataSources(), ruleMetaData.getRules(), 
props, schemaName);
+                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
ruleMetaData.getRules(), props, schemaName);
         Map<String, ShardingSphereSchema> schemaMap = 
GenericSchemaBuilder.build(Collections.singletonList(tableName), material);
         return Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> 
optional.getTable(tableName))
                 .orElseGet(() -> new ShardingSphereTable(tableName, 
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
diff --git 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/CreateTableStatementSchemaRefresher.java
 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/CreateTableStatementSchemaRefresher.java
index 603e03df875..db732e7a98b 100644
--- 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/CreateTableStatementSchemaRefresher.java
+++ 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/CreateTableStatementSchemaRefresher.java
@@ -54,7 +54,7 @@ public final class CreateTableStatementSchemaRefresher 
implements MetaDataRefres
             ruleMetaData.findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
         }
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(),
-                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getDataSources(), ruleMetaData.getRules(), 
props, schemaName);
+                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
ruleMetaData.getRules(), props, schemaName);
         Map<String, ShardingSphereSchema> schemaMap = 
GenericSchemaBuilder.build(Collections.singletonList(tableName), material);
         Optional<ShardingSphereTable> actualTableMetaData = 
Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> 
optional.getTable(tableName));
         if (actualTableMetaData.isPresent()) {
diff --git 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/RenameTableStatementSchemaRefresher.java
 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/RenameTableStatementSchemaRefresher.java
index 8324062b68f..62bf4aba378 100644
--- 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/RenameTableStatementSchemaRefresher.java
+++ 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/table/RenameTableStatementSchemaRefresher.java
@@ -64,7 +64,7 @@ public final class RenameTableStatementSchemaRefresher 
implements MetaDataRefres
             ruleMetaData.findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
         }
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(),
-                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getDataSources(), ruleMetaData.getRules(), 
props, schemaName);
+                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
ruleMetaData.getRules(), props, schemaName);
         Map<String, ShardingSphereSchema> schemaMap = 
GenericSchemaBuilder.build(Collections.singletonList(tableName), material);
         return Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> 
optional.getTable(tableName))
                 .orElseGet(() -> new ShardingSphereTable(tableName, 
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
diff --git 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/AlterViewStatementSchemaRefresher.java
 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/AlterViewStatementSchemaRefresher.java
index b7607fac5d3..84f9e3aa36b 100644
--- 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/AlterViewStatementSchemaRefresher.java
+++ 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/AlterViewStatementSchemaRefresher.java
@@ -78,7 +78,7 @@ public final class AlterViewStatementSchemaRefresher 
implements MetaDataRefreshe
             ruleMetaData.findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, viewName));
         }
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(),
-                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getDataSources(), ruleMetaData.getRules(), 
props, schemaName);
+                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
ruleMetaData.getRules(), props, schemaName);
         Map<String, ShardingSphereSchema> schemaMap = 
GenericSchemaBuilder.build(Collections.singletonList(viewName), material);
         Optional<ShardingSphereTable> actualViewMetaData = 
Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> 
optional.getTable(viewName));
         ShardingSphereSchema result = new ShardingSphereSchema();
diff --git 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/CreateViewStatementSchemaRefresher.java
 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/CreateViewStatementSchemaRefresher.java
index f936013eab8..a95506639c3 100644
--- 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/CreateViewStatementSchemaRefresher.java
+++ 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/refresher/type/view/CreateViewStatementSchemaRefresher.java
@@ -54,7 +54,7 @@ public final class CreateViewStatementSchemaRefresher 
implements MetaDataRefresh
             ruleMetaData.findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, viewName));
         }
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(),
-                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getDataSources(), ruleMetaData.getRules(), 
props, schemaName);
+                database.getResourceMetaData().getStorageTypes(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
ruleMetaData.getRules(), props, schemaName);
         Map<String, ShardingSphereSchema> schemaMap = 
GenericSchemaBuilder.build(Collections.singletonList(viewName), material);
         Optional<ShardingSphereTable> actualTableMetaData = 
Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> 
optional.getTable(viewName));
         if (actualTableMetaData.isPresent()) {
diff --git 
a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/AllSQLRouteExecutor.java
 
b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/AllSQLRouteExecutor.java
index ad5381e5689..cc22cbd17fc 100644
--- 
a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/AllSQLRouteExecutor.java
+++ 
b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/AllSQLRouteExecutor.java
@@ -36,7 +36,7 @@ public final class AllSQLRouteExecutor implements 
SQLRouteExecutor {
     @Override
     public RouteContext route(final ConnectionContext connectionContext, final 
QueryContext queryContext, final RuleMetaData globalRuleMetaData, final 
ShardingSphereDatabase database) {
         RouteContext result = new RouteContext();
-        for (String each : 
database.getResourceMetaData().getDataSources().keySet()) {
+        for (String each : 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().keySet())
 {
             result.getRouteUnits().add(new RouteUnit(new RouteMapper(each, 
each), Collections.emptyList()));
         }
         return result;
diff --git 
a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutor.java
 
b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutor.java
index e755297f9cf..1f646fbec94 100644
--- 
a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutor.java
+++ 
b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutor.java
@@ -59,7 +59,7 @@ public final class PartialSQLRouteExecutor implements 
SQLRouteExecutor {
     @SuppressWarnings({"unchecked", "rawtypes"})
     public RouteContext route(final ConnectionContext connectionContext, final 
QueryContext queryContext, final RuleMetaData globalRuleMetaData, final 
ShardingSphereDatabase database) {
         RouteContext result = new RouteContext();
-        Optional<String> dataSourceName = 
findDataSourceByHint(queryContext.getHintValueContext(), 
database.getResourceMetaData().getDataSources());
+        Optional<String> dataSourceName = 
findDataSourceByHint(queryContext.getHintValueContext(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources());
         if (dataSourceName.isPresent()) {
             result.getRouteUnits().add(new RouteUnit(new 
RouteMapper(dataSourceName.get(), dataSourceName.get()), 
Collections.emptyList()));
             return result;
@@ -71,8 +71,8 @@ public final class PartialSQLRouteExecutor implements 
SQLRouteExecutor {
                 entry.getValue().decorateRouteContext(result, queryContext, 
database, entry.getKey(), props, connectionContext);
             }
         }
-        if (result.getRouteUnits().isEmpty() && 1 == 
database.getResourceMetaData().getDataSources().size()) {
-            String singleDataSourceName = 
database.getResourceMetaData().getDataSources().keySet().iterator().next();
+        if (result.getRouteUnits().isEmpty() && 1 == 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().size())
 {
+            String singleDataSourceName = 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources().keySet().iterator().next();
             result.getRouteUnits().add(new RouteUnit(new 
RouteMapper(singleDataSourceName, singleDataSourceName), 
Collections.emptyList()));
         }
         return result;
diff --git 
a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/AllSQLRouteExecutorTest.java
 
b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/AllSQLRouteExecutorTest.java
index 00c213bd5b3..cce673b1239 100644
--- 
a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/AllSQLRouteExecutorTest.java
+++ 
b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/AllSQLRouteExecutorTest.java
@@ -42,7 +42,7 @@ class AllSQLRouteExecutorTest {
     void assertRouteSuccess() {
         String name = "test";
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(database.getResourceMetaData().getDataSources().keySet()).thenReturn(Stream.of(name).collect(Collectors.toSet()));
+        
when(database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().keySet()).thenReturn(Stream.of(name).collect(Collectors.toSet()));
         AllSQLRouteExecutor allSQLRouteExecutor = new AllSQLRouteExecutor();
         RouteContext actual = allSQLRouteExecutor.route(new 
ConnectionContext(), mock(QueryContext.class), mock(RuleMetaData.class), 
database);
         assertThat(actual.getRouteUnits().size(), is(1));
diff --git 
a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutorTest.java
 
b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutorTest.java
index 03f58de8a9e..3d4ae1ba633 100644
--- 
a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutorTest.java
+++ 
b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/impl/PartialSQLRouteExecutorTest.java
@@ -68,7 +68,7 @@ class PartialSQLRouteExecutorTest {
         Map<String, DataSource> dataSourceMap = new HashMap<>();
         dataSourceMap.put("ds_0", null);
         dataSourceMap.put("ds_1", null);
-        
when(database.getResourceMetaData().getDataSources()).thenReturn(dataSourceMap);
+        
when(database.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(dataSourceMap);
     }
     
     @Test
diff --git 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/core/rule/GlobalClockRule.java
 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/core/rule/GlobalClockRule.java
index 88966cdde00..fd6cb10a630 100644
--- 
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/core/rule/GlobalClockRule.java
+++ 
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/core/rule/GlobalClockRule.java
@@ -60,8 +60,8 @@ public final class GlobalClockRule implements GlobalRule {
     }
     
     private Collection<DataSource> getDataSources(final Map<String, 
ShardingSphereDatabase> databases) {
-        return databases.values().stream().filter(each -> 
!each.getResourceMetaData().getDataSources().isEmpty())
-                .flatMap(each -> 
each.getResourceMetaData().getDataSources().values().stream()).collect(Collectors.toList());
+        return databases.values().stream().filter(each -> 
!each.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().isEmpty())
+                .flatMap(each -> 
each.getResourceMetaData().getStorageUnitMetaData().getDataSources().values().stream()).collect(Collectors.toList());
     }
     
     /**
diff --git 
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactoryTest.java
 
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactoryTest.java
index b4341565049..f5a5b39bce5 100644
--- 
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactoryTest.java
+++ 
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactoryTest.java
@@ -41,7 +41,7 @@ class ExternalMetaDataFactoryTest {
         DatabaseConfiguration databaseConfig = new 
DataSourceProvidedDatabaseConfiguration(Collections.emptyMap(), 
Collections.emptyList());
         ShardingSphereDatabase actual = 
ExternalMetaDataFactory.create("foo_db", databaseConfig, new 
ConfigurationProperties(new Properties()), mock(InstanceContext.class));
         assertThat(actual.getName(), is("foo_db"));
-        assertTrue(actual.getResourceMetaData().getDataSources().isEmpty());
+        
assertTrue(actual.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().isEmpty());
     }
     
     @Test
@@ -50,7 +50,7 @@ class ExternalMetaDataFactoryTest {
         Map<String, ShardingSphereDatabase> actual = 
ExternalMetaDataFactory.create(
                 Collections.singletonMap("foo_db", databaseConfig), new 
ConfigurationProperties(new Properties()), mock(InstanceContext.class));
         assertTrue(actual.containsKey("foo_db"));
-        
assertTrue(actual.get("foo_db").getResourceMetaData().getDataSources().isEmpty());
+        
assertTrue(actual.get("foo_db").getResourceMetaData().getStorageUnitMetaData().getStorageUnits().isEmpty());
     }
     
     @Test
@@ -59,6 +59,6 @@ class ExternalMetaDataFactoryTest {
         Map<String, ShardingSphereDatabase> actual = 
ExternalMetaDataFactory.create(
                 Collections.singletonMap("FOO_DB", databaseConfig), new 
ConfigurationProperties(new Properties()), mock(InstanceContext.class));
         assertTrue(actual.containsKey("foo_db"));
-        
assertTrue(actual.get("foo_db").getResourceMetaData().getDataSources().isEmpty());
+        
assertTrue(actual.get("foo_db").getResourceMetaData().getStorageUnitMetaData().getStorageUnits().isEmpty());
     }
 }
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
index 0cd2b288b36..d6cf5845ce3 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
@@ -47,7 +47,7 @@ public final class SingleSQLRouter implements 
SQLRouter<SingleRule> {
     @Override
     public RouteContext createRouteContext(final QueryContext queryContext, 
final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, 
final SingleRule rule,
                                            final ConfigurationProperties 
props, final ConnectionContext connectionContext) {
-        if (1 == database.getResourceMetaData().getDataSources().size()) {
+        if (1 == 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().size())
 {
             return createSingleDataSourceRouteContext(rule, database);
         }
         RouteContext result = new RouteContext();
@@ -82,7 +82,7 @@ public final class SingleSQLRouter implements 
SQLRouter<SingleRule> {
     
     private RouteContext createSingleDataSourceRouteContext(final SingleRule 
rule, final ShardingSphereDatabase database) {
         String logicDataSource = rule.getDataSourceNames().iterator().next();
-        String actualDataSource = 
database.getResourceMetaData().getDataSources().keySet().iterator().next();
+        String actualDataSource = 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().keySet().iterator().next();
         RouteContext result = new RouteContext();
         result.getRouteUnits().add(new RouteUnit(new 
RouteMapper(logicDataSource, actualDataSource), Collections.emptyList()));
         return result;
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
index 0554299ba31..23236286ace 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.storage.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.route.SQLRouter;
@@ -82,7 +83,7 @@ class SingleSQLRouterTest {
     
     private ShardingSphereDatabase mockSingleDatabase() {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(result.getResourceMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 new MockedDataSource()));
+        
when(result.getResourceMetaData().getStorageUnitMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
 mock(StorageUnit.class)));
         return result;
     }
     
@@ -104,7 +105,7 @@ class SingleSQLRouterTest {
     private ShardingSphereDatabase mockReadwriteSplittingDatabase() {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(result.getName()).thenReturn(" db_schema");
-        
when(result.getResourceMetaData().getDataSources()).thenReturn(Collections.singletonMap("write_ds",
 new MockedDataSource()));
+        
when(result.getResourceMetaData().getStorageUnitMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("write_ds",
 mock(StorageUnit.class)));
         return result;
     }
     
@@ -148,7 +149,7 @@ class SingleSQLRouterTest {
         Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1F);
         dataSourceMap.put("ds_0", new MockedDataSource());
         dataSourceMap.put("ds_1", new MockedDataSource());
-        
when(result.getResourceMetaData().getDataSources()).thenReturn(dataSourceMap);
+        
when(result.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(dataSourceMap);
         when(result.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         when(schema.containsTable("t_order")).thenReturn(true);
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTableExecutor.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTableExecutor.java
index d3d23805cdc..8f4897a99ee 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTableExecutor.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTableExecutor.java
@@ -60,7 +60,8 @@ public final class ShowUnloadedSingleTableExecutor implements 
RQLExecutor<ShowUn
     
     private Map<String, Collection<DataNode>> getActualDataNodes(final 
ShardingSphereDatabase database) {
         ResourceMetaData resourceMetaData = database.getResourceMetaData();
-        Map<String, DataSource> aggregateDataSourceMap = 
SingleTableLoadUtils.getAggregatedDataSourceMap(resourceMetaData.getDataSources(),
 database.getRuleMetaData().getRules());
+        Map<String, DataSource> aggregateDataSourceMap = 
SingleTableLoadUtils.getAggregatedDataSourceMap(
+                resourceMetaData.getStorageUnitMetaData().getDataSources(), 
database.getRuleMetaData().getRules());
         Collection<String> excludedTables = 
SingleTableLoadUtils.getExcludedTables(database.getRuleMetaData().getRules());
         return SingleTableDataNodeLoader.load(database.getName(), 
database.getProtocolType(), aggregateDataSourceMap, excludedTables);
     }
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableStatementUpdater.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableStatementUpdater.java
index ece0779d4af..63a134642e3 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableStatementUpdater.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableStatementUpdater.java
@@ -112,7 +112,8 @@ public final class LoadSingleTableStatementUpdater 
implements RuleDefinitionCrea
             return;
         }
         ResourceMetaData resourceMetaData = database.getResourceMetaData();
-        Map<String, DataSource> aggregateDataSourceMap = 
SingleTableLoadUtils.getAggregatedDataSourceMap(resourceMetaData.getDataSources(),
 database.getRuleMetaData().getRules());
+        Map<String, DataSource> aggregateDataSourceMap = 
SingleTableLoadUtils.getAggregatedDataSourceMap(
+                resourceMetaData.getStorageUnitMetaData().getDataSources(), 
database.getRuleMetaData().getRules());
         Map<String, Map<String, Collection<String>>> actualTableNodes = new 
LinkedHashMap<>();
         for (String each : requiredDataSources) {
             Map<String, Collection<String>> schemaTableNames = 
SingleTableDataNodeLoader.loadSchemaTableNames(database.getName(), 
database.getProtocolType(), aggregateDataSourceMap.get(each), each);
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitStatementUpdater.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitStatementUpdater.java
index 6a1dfbc2f86..f353939f286 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitStatementUpdater.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitStatementUpdater.java
@@ -40,7 +40,7 @@ public final class 
SetDefaultSingleTableStorageUnitStatementUpdater implements R
     
     private void checkStorageUnitExist(final ShardingSphereDatabase database, 
final SetDefaultSingleTableStorageUnitStatement sqlStatement) {
         if (!Strings.isNullOrEmpty(sqlStatement.getDefaultStorageUnit())) {
-            Collection<String> storageUnitNames = 
database.getResourceMetaData().getDataSources().keySet();
+            Collection<String> storageUnitNames = 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().keySet();
             
ShardingSpherePreconditions.checkState(storageUnitNames.contains(sqlStatement.getDefaultStorageUnit()),
                     () -> new 
MissingRequiredStorageUnitsException(database.getName(), 
Collections.singleton(sqlStatement.getDefaultStorageUnit())));
         }
diff --git 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
index ee400676678..9477e5ba0d9 100644
--- 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
+++ 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
@@ -71,7 +71,7 @@ public final class TransactionRule implements GlobalRule, 
ResourceHeldRule<Shard
         Map<String, DatabaseType> databaseTypes = new 
LinkedHashMap<>(databases.size(), 1F);
         for (Entry<String, ShardingSphereDatabase> entry : 
databases.entrySet()) {
             ShardingSphereDatabase database = entry.getValue();
-            database.getResourceMetaData().getDataSources().forEach((key, 
value) -> dataSourceMap.put(database.getName() + "." + key, value));
+            
database.getResourceMetaData().getStorageUnitMetaData().getDataSources().forEach((key,
 value) -> dataSourceMap.put(database.getName() + "." + key, value));
             database.getResourceMetaData().getStorageTypes().forEach((key, 
value) -> databaseTypes.put(database.getName() + "." + key, value));
         }
         if (dataSourceMap.isEmpty()) {
diff --git 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
index a62016760ba..677258b7e23 100644
--- 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
+++ 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
@@ -37,6 +37,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -61,16 +62,14 @@ class TransactionRuleTest {
         assertThat(actual.getDatabases().size(), is(2));
         assertTrue(actual.getDatabases().containsKey(SHARDING_DB_1));
         ResourceMetaData resourceMetaData1 = 
actual.getDatabases().get(SHARDING_DB_1).getResourceMetaData();
-        assertThat(resourceMetaData1.getDataSources().size(), is(2));
-        assertTrue(resourceMetaData1.getDataSources().containsKey("ds_0"));
-        assertTrue(resourceMetaData1.getDataSources().containsKey("ds_1"));
-        assertThat(resourceMetaData1.getStorageTypes().size(), is(2));
+        
assertThat(resourceMetaData1.getStorageUnitMetaData().getDataSources().size(), 
is(2));
+        
assertTrue(resourceMetaData1.getStorageUnitMetaData().getDataSources().containsKey("ds_0"));
+        
assertTrue(resourceMetaData1.getStorageUnitMetaData().getDataSources().containsKey("ds_1"));
         assertTrue(actual.getDatabases().containsKey(SHARDING_DB_2));
         ResourceMetaData resourceMetaData2 = 
actual.getDatabases().get(SHARDING_DB_2).getResourceMetaData();
-        assertThat(resourceMetaData2.getDataSources().size(), is(2));
-        assertTrue(resourceMetaData2.getDataSources().containsKey("ds_0"));
-        assertTrue(resourceMetaData2.getDataSources().containsKey("ds_1"));
-        assertThat(resourceMetaData2.getStorageTypes().size(), is(2));
+        
assertThat(resourceMetaData2.getStorageUnitMetaData().getDataSources().size(), 
is(2));
+        
assertTrue(resourceMetaData2.getStorageUnitMetaData().getDataSources().containsKey("ds_0"));
+        
assertTrue(resourceMetaData2.getStorageUnitMetaData().getDataSources().containsKey("ds_1"));
         
assertThat(actual.getResource().getTransactionManager(TransactionType.XA), 
instanceOf(ShardingSphereTransactionManagerFixture.class));
     }
     
@@ -99,11 +98,11 @@ class TransactionRuleTest {
     }
     
     private ResourceMetaData createResourceMetaData() {
-        ResourceMetaData result = mock(ResourceMetaData.class);
+        ResourceMetaData result = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         Map<String, DataSource> dataSourceMap = new LinkedHashMap<>(2, 1F);
         dataSourceMap.put("ds_0", new MockedDataSource());
         dataSourceMap.put("ds_1", new MockedDataSource());
-        when(result.getDataSources()).thenReturn(dataSourceMap);
+        
when(result.getStorageUnitMetaData().getDataSources()).thenReturn(dataSourceMap);
         Map<String, DatabaseType> databaseTypes = new LinkedHashMap<>(2, 1F);
         databaseTypes.put("ds_0", 
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL"));
         databaseTypes.put("ds_1", 
TypedSPILoader.getService(DatabaseType.class, "openGauss"));
@@ -120,11 +119,11 @@ class TransactionRuleTest {
     }
     
     private ResourceMetaData createAddResourceMetaData() {
-        ResourceMetaData result = mock(ResourceMetaData.class);
+        ResourceMetaData result = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         Map<String, DataSource> dataSourceMap = new LinkedHashMap<>(2, 1F);
         dataSourceMap.put("ds_0", new MockedDataSource());
         dataSourceMap.put("ds_1", new MockedDataSource());
-        when(result.getDataSources()).thenReturn(dataSourceMap);
+        
when(result.getStorageUnitMetaData().getDataSources()).thenReturn(dataSourceMap);
         Map<String, DatabaseType> databaseTypes = new LinkedHashMap<>(2, 1F);
         databaseTypes.put("ds_0", 
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL"));
         databaseTypes.put("ds_1", 
TypedSPILoader.getService(DatabaseType.class, "openGauss"));
diff --git 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java
 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java
index fdff2da88c1..252f6d72b4d 100644
--- 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java
+++ 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java
@@ -49,7 +49,7 @@ class TransactionRuleBuilderTest {
                 new 
RuleMetaData(Collections.singletonList(mock(ShardingSphereRule.class))), 
Collections.singletonMap("test", mock(ShardingSphereSchema.class)));
         TransactionRule rule = new TransactionRuleBuilder().build(ruleConfig, 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database), 
mock(ConfigurationProperties.class));
         assertNotNull(rule.getConfiguration());
-        
assertThat(rule.getDatabases().get("logic_db").getResourceMetaData().getDataSources().size(),
 is(2));
+        
assertThat(rule.getDatabases().get("logic_db").getResourceMetaData().getStorageUnitMetaData().getStorageUnits().size(),
 is(2));
     }
     
     private Map<String, DataSource> createDataSourceMap() {
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 007aa7b580a..2d547c32e39 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -105,7 +105,7 @@ public final class ContextManager implements AutoCloseable {
      * @return data source map
      */
     public Map<String, DataSource> getDataSourceMap(final String databaseName) 
{
-        return 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        return 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources();
     }
     
     /**
@@ -182,7 +182,7 @@ public final class ContextManager implements AutoCloseable {
         ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
         database.reloadRules(MutableDataNodeRule.class);
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(), 
database.getResourceMetaData().getStorageTypes(),
-                Collections.singletonMap(dataSourceName, 
database.getResourceMetaData().getDataSources().get(dataSourceName)),
+                Collections.singletonMap(dataSourceName, 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources().get(dataSourceName)),
                 database.getRuleMetaData().getRules(), 
metaDataContexts.get().getMetaData().getProps(), schemaName);
         ShardingSphereSchema result = 
GenericSchemaBuilder.build(material).get(schemaName);
         
result.getViews().putAll(metaDataContexts.get().getPersistService().getDatabaseMetaDataService().getViewMetaDataPersistService().load(database.getName(),
 schemaName));
@@ -197,7 +197,7 @@ public final class ContextManager implements AutoCloseable {
      * @param tableName to be reloaded table name
      */
     public void reloadTable(final String databaseName, final String 
schemaName, final String tableName) {
-        Map<String, DataSource> dataSourceMap = 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        Map<String, DataSource> dataSourceMap = 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources();
         try {
             reloadTable(databaseName, schemaName, tableName, dataSourceMap);
         } catch (final SQLException ex) {
@@ -215,7 +215,7 @@ public final class ContextManager implements AutoCloseable {
      */
     public void reloadTable(final String databaseName, final String 
schemaName, final String dataSourceName, final String tableName) {
         Map<String, DataSource> dataSourceMap = Collections.singletonMap(
-                dataSourceName, 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources().get(dataSourceName));
+                dataSourceName, 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources().get(dataSourceName));
         try {
             reloadTable(databaseName, schemaName, tableName, dataSourceMap);
         } catch (final SQLException ex) {
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
index 1dfbe5f22da..2329878a646 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
@@ -173,7 +173,8 @@ public final class ConfigurationContextManager {
             ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
             Collection<ShardingSphereRule> rules = new 
LinkedList<>(database.getRuleMetaData().getRules());
             rules.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
-            rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getResourceMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig, instanceContext));
+            rules.addAll(DatabaseRulesBuilder.build(databaseName,
+                    
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig, instanceContext));
             refreshMetadata(databaseName, database, rules);
         } catch (final SQLException ex) {
             log.error("Alter database: {} rule configurations failed", 
databaseName, ex);
@@ -192,7 +193,8 @@ public final class ConfigurationContextManager {
             Collection<ShardingSphereRule> rules = new 
LinkedList<>(database.getRuleMetaData().getRules());
             rules.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
             if (isNotEmptyConfig(ruleConfig)) {
-                rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getResourceMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig, instanceContext));
+                rules.addAll(DatabaseRulesBuilder.build(databaseName,
+                        
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig, instanceContext));
             }
             refreshMetadata(databaseName, database, rules);
         } catch (final SQLException ex) {
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
index e4d73ddc0bd..7a7a2d8e0c3 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
@@ -146,7 +146,7 @@ public final class MetaDataContextsFactory {
         for (Entry<String, ? extends DatabaseConfiguration> entry : 
param.getDatabaseConfigs().entrySet()) {
             String databaseName = entry.getKey();
             
metadataContexts.getPersistService().persistConfigurations(entry.getKey(), 
entry.getValue(),
-                    
metadataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                    
metadataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources(),
                     
metadataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules());
         }
     }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
index 2b117a0d76a..199911a512d 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
@@ -148,7 +148,7 @@ public final class NewMetaDataContextsFactory {
         for (Entry<String, ? extends DatabaseConfiguration> entry : 
param.getDatabaseConfigs().entrySet()) {
             String databaseName = entry.getKey();
             
metadataContexts.getPersistService().persistConfigurations(entry.getKey(), 
entry.getValue(),
-                    
metadataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                    
metadataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources(),
                     
metadataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules());
         }
     }
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index c5bda1d34de..7c5ecec3fa0 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -241,7 +241,7 @@ class ContextManagerTest {
         
when(metaDataContexts.getMetaData().getGlobalRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.emptyList()));
         
contextManager.getConfigurationContextManager().alterDataSourceUnitsConfiguration("foo_db",
                 Collections.singletonMap("foo_ds", new 
DataSourcePoolProperties(MockedDataSource.class.getName(), 
createProperties("test", "test"))));
-        
assertThat(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getDataSources().size(),
 is(3));
+        
assertThat(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnitMetaData().getStorageUnits().size(),
 is(3));
         assertAlteredDataSource((MockedDataSource) 
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")
                 .getResourceMetaData().getStorageNodeDataSources().get(new 
StorageNode("foo_ds")));
     }
@@ -251,7 +251,7 @@ class ContextManagerTest {
         Map<String, DataSource> originalDataSources = new LinkedHashMap<>(2, 
1F);
         originalDataSources.put("ds_1", new MockedDataSource());
         originalDataSources.put("ds_2", new MockedDataSource());
-        when(result.getDataSources()).thenReturn(originalDataSources);
+        
when(result.getStorageUnitMetaData().getDataSources()).thenReturn(originalDataSources);
         Map<StorageNode, DataSource> storageNodeDataSourceMap = 
StorageResourceUtils.getStorageNodeDataSources(originalDataSources);
         Map<String, StorageUnit> storageUnits = new LinkedHashMap<>(2, 1F);
         Map<String, StorageUnitNodeMapper> storageUnitNodeMappers = 
StorageResourceUtils.getStorageUnitNodeMappers(originalDataSources);
@@ -285,7 +285,6 @@ class ContextManagerTest {
     
     @Test
     void assertReloadSchema() {
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getResourceMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 new MockedDataSource()));
         
when(metaDataContexts.getMetaData().getDatabase("foo_db").getName()).thenReturn("foo_db");
         DatabaseMetaDataPersistService databaseMetaDataPersistService = 
mock(DatabaseMetaDataPersistService.class, RETURNS_DEEP_STUBS);
         MetaDataPersistService persistService = 
mock(MetaDataPersistService.class);
@@ -297,7 +296,8 @@ class ContextManagerTest {
     
     @Test
     void assertReloadTable() {
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getResourceMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 new MockedDataSource()));
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnitMetaData().getDataSources())
+                .thenReturn(Collections.singletonMap("foo_ds", new 
MockedDataSource()));
         
when(metaDataContexts.getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("foo_ds",
                 TypedSPILoader.getService(DatabaseType.class, "MySQL")));
         DatabaseMetaDataPersistService databaseMetaDataPersistService = 
mock(DatabaseMetaDataPersistService.class, RETURNS_DEEP_STUBS);
@@ -305,7 +305,7 @@ class ContextManagerTest {
         
when(persistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
         when(metaDataContexts.getPersistService()).thenReturn(persistService);
         contextManager.reloadTable("foo_db", "foo_schema", "foo_table");
-        
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getDataSources().containsKey("foo_ds"));
+        
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnitMetaData().getDataSources().containsKey("foo_ds"));
     }
     
     private Map<String, Object> createProperties(final String username, final 
String password) {
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/process/subscriber/ProcessListChangedSubscriberTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/process/subscriber/ProcessListChangedSubscriberTest.java
index 66fc5fc3292..c022e300b39 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/process/subscriber/ProcessListChangedSubscriberTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/process/subscriber/ProcessListChangedSubscriberTest.java
@@ -98,7 +98,7 @@ class ProcessListChangedSubscriberTest {
     }
     
     private Map<String, ShardingSphereDatabase> createDatabases() {
-        when(database.getResourceMetaData().getDataSources()).thenReturn(new 
LinkedHashMap<>());
+        
when(database.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(new
 LinkedHashMap<>());
         
when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0",
 TypedSPILoader.getService(DatabaseType.class, "MySQL")));
         
when(database.getSchemas()).thenReturn(Collections.singletonMap("foo_schema", 
new ShardingSphereSchema()));
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriberTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriberTest.java
index 6421832f39f..f09a18e67c6 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriberTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriberTest.java
@@ -135,7 +135,7 @@ class ConfigurationChangedSubscriberTest {
     @Test
     void assertRenewForDataSourceChanged() {
         subscriber.renew(new DataSourceUnitsChangedEvent("db", "0", 
createChangedDataSourcePoolPropertiesMap()));
-        
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("db").getResourceMetaData().getDataSources().containsKey("ds_2"));
+        
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("db").getResourceMetaData().getStorageUnitMetaData().getStorageUnits().containsKey("ds_2"));
     }
     
     private Map<String, DataSourcePoolProperties> 
createChangedDataSourcePoolPropertiesMap() {
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ResourceMetaDataChangedSubscriberTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ResourceMetaDataChangedSubscriberTest.java
index 27ccb8acd90..69f62bcf9e5 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ResourceMetaDataChangedSubscriberTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ResourceMetaDataChangedSubscriberTest.java
@@ -100,8 +100,6 @@ class ResourceMetaDataChangedSubscriberTest {
     
     private Map<String, ShardingSphereDatabase> createDatabases() {
         when(database.getName()).thenReturn("db");
-        when(database.getResourceMetaData().getDataSources()).thenReturn(new 
LinkedHashMap<>());
-        
when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0",
 TypedSPILoader.getService(DatabaseType.class, "FIXTURE")));
         
when(database.getSchemas()).thenReturn(Collections.singletonMap("foo_schema", 
new ShardingSphereSchema()));
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         
when(database.getSchema("foo_schema")).thenReturn(mock(ShardingSphereSchema.class));
@@ -116,7 +114,7 @@ class ResourceMetaDataChangedSubscriberTest {
         
when(persistService.getDataSourceUnitService().load("db_added")).thenReturn(createDataSourcePoolPropertiesMap());
         
when(persistService.getDatabaseRulePersistService().load("db_added")).thenReturn(Collections.emptyList());
         subscriber.renew(new DatabaseAddedEvent("db_added"));
-        
assertNotNull(contextManager.getMetaDataContexts().getMetaData().getDatabase("db_added").getResourceMetaData().getDataSources());
+        
assertNotNull(contextManager.getMetaDataContexts().getMetaData().getDatabase("db_added").getResourceMetaData().getStorageUnitMetaData().getStorageUnits());
     }
     
     private Map<String, DataSourcePoolProperties> 
createDataSourcePoolPropertiesMap() {
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
index e46b6839056..30191e958b5 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber;
 import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
 import 
org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData;
@@ -30,10 +29,11 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabas
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.infra.state.cluster.ClusterState;
+import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
 import org.apache.shardingsphere.infra.state.instance.InstanceState;
 import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
 import 
org.apache.shardingsphere.mode.event.storage.StorageNodeDataSourceChangedEvent;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeRole;
@@ -65,7 +65,6 @@ import org.mockito.quality.Strictness;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Objects;
@@ -107,8 +106,6 @@ class StateChangedSubscriberTest {
     }
     
     private Map<String, ShardingSphereDatabase> createDatabases() {
-        when(database.getResourceMetaData().getDataSources()).thenReturn(new 
LinkedHashMap<>());
-        
when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0",
 TypedSPILoader.getService(DatabaseType.class, "FIXTURE")));
         
when(database.getSchemas()).thenReturn(Collections.singletonMap("foo_schema", 
new ShardingSphereSchema()));
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         
when(database.getSchema("foo_schema")).thenReturn(mock(ShardingSphereSchema.class));
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSource.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSource.java
index 4c3a45a1187..07cb4218717 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSource.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSource.java
@@ -68,7 +68,8 @@ public final class JDBCBackendDataSource implements 
BackendDataSource {
     @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
     public List<Connection> getConnections(final String databaseName, final 
String dataSourceName,
                                            final int connectionSize, final 
ConnectionMode connectionMode, final TransactionType transactionType) throws 
SQLException {
-        DataSource dataSource = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources().get(dataSourceName);
+        DataSource dataSource = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData()
+                
.getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources().get(dataSourceName);
         if (dataSourceName.contains(".")) {
             String dataSourceStr = dataSourceName.split("\\.")[0];
             if 
(GlobalDataSourceRegistry.getInstance().getCachedDataSources().containsKey(dataSourceStr))
 {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
index f65543f9aa4..c37aab7c5b0 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
@@ -161,7 +161,7 @@ public abstract class AbstractDatabaseMetaDataExecutor 
implements DatabaseAdminQ
         @Override
         protected void processMetaData(final String databaseName, final 
Consumer<ResultSet> callback) throws SQLException {
             ResourceMetaData resourceMetaData = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
-            Optional<Entry<String, DataSource>> dataSourceEntry = 
resourceMetaData.getDataSources().entrySet().stream().findFirst();
+            Optional<Entry<String, DataSource>> dataSourceEntry = 
resourceMetaData.getStorageUnitMetaData().getDataSources().entrySet().stream().findFirst();
             if (!dataSourceEntry.isPresent()) {
                 return;
             }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
index 575d012aab9..f12e20e3480 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
@@ -87,7 +87,7 @@ public final class ExportStorageNodesExecutor implements 
MetaDataRequiredQueryab
     
     private Map<String, Collection<ExportedStorageNode>> 
generateDatabaseExportStorageNodesData(final ShardingSphereDatabase database) {
         Map<String, ExportedStorageNode> storageNodes = new LinkedHashMap<>();
-        for (Entry<String, DataSource> entry : 
database.getResourceMetaData().getDataSources().entrySet()) {
+        for (Entry<String, DataSource> entry : 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources().entrySet())
 {
             ConnectionProperties connectionProps = 
database.getResourceMetaData().getConnectionProperties(entry.getKey());
             String databaseInstanceIp = getDatabaseInstanceIp(connectionProps);
             if (storageNodes.containsKey(databaseInstanceIp)) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
index 5185efcb505..24ad12ffa15 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
@@ -129,7 +129,8 @@ public final class NewRuleDefinitionBackendHandler<T 
extends RuleDefinitionState
     @SuppressWarnings({"unchecked", "rawtypes"})
     private RuleConfiguration decorateRuleConfiguration(final 
ShardingSphereDatabase database, final RuleConfiguration ruleConfig) {
         Optional<RuleConfigurationDecorator> decorator = 
TypedSPILoader.findService(RuleConfigurationDecorator.class, 
ruleConfig.getClass());
-        return decorator.map(optional -> optional.decorate(database.getName(), 
database.getResourceMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig)).orElse(ruleConfig);
+        return decorator.map(optional -> optional.decorate(database.getName(),
+                
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig)).orElse(ruleConfig);
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
index 0eb13c5eaa5..8181ed052df 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
@@ -101,7 +101,8 @@ public final class RuleDefinitionBackendHandler<T extends 
RuleDefinitionStatemen
     @SuppressWarnings({"unchecked", "rawtypes"})
     private RuleConfiguration decorateRuleConfiguration(final 
ShardingSphereDatabase database, final RuleConfiguration ruleConfig) {
         Optional<RuleConfigurationDecorator> decorator = 
TypedSPILoader.findService(RuleConfigurationDecorator.class, 
ruleConfig.getClass());
-        return decorator.map(optional -> optional.decorate(database.getName(), 
database.getResourceMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig)).orElse(ruleConfig);
+        return decorator.map(optional -> optional.decorate(database.getName(),
+                
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
database.getRuleMetaData().getRules(), ruleConfig)).orElse(ruleConfig);
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
index 8d0f3a36107..c00e6fe3f44 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
@@ -100,13 +100,13 @@ public final class AlterStorageUnitBackendHandler extends 
StorageUnitDefinitionB
     }
     
     private void checkStorageUnitNameExisted(final String databaseName, final 
Collection<String> storageUnitNames) {
-        Map<String, DataSource> storageUnits = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        Map<String, DataSource> storageUnits = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources();
         Collection<String> notExistedStorageUnitNames = 
storageUnitNames.stream().filter(each -> 
!storageUnits.containsKey(each)).collect(Collectors.toList());
         
ShardingSpherePreconditions.checkState(notExistedStorageUnitNames.isEmpty(), () 
-> new MissingRequiredStorageUnitsException(databaseName, 
notExistedStorageUnitNames));
     }
     
     private void checkDatabase(final String databaseName, final 
AlterStorageUnitStatement sqlStatement) {
-        Map<String, DataSource> storageUnits = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        Map<String, DataSource> storageUnits = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources();
         Collection<String> invalidStorageUnitNames = 
sqlStatement.getStorageUnits().stream().collect(Collectors.toMap(DataSourceSegment::getName,
 each -> each)).entrySet().stream()
                 .filter(each -> !isIdenticalDatabase(each.getValue(), 
storageUnits.get(each.getKey()))).map(Entry::getKey).collect(Collectors.toSet());
         
ShardingSpherePreconditions.checkState(invalidStorageUnitNames.isEmpty(),
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
index 0c822b780cb..07715988233 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
@@ -71,14 +71,15 @@ public final class UnregisterStorageUnitBackendHandler 
extends StorageUnitDefini
     }
     
     private void checkExisted(final String databaseName, final 
Collection<String> storageUnitNames) {
-        Map<String, DataSource> dataSources = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        Map<String, DataSource> dataSources = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources();
         Collection<String> notExistedStorageUnits = 
storageUnitNames.stream().filter(each -> 
!dataSources.containsKey(each)).collect(Collectors.toList());
         
ShardingSpherePreconditions.checkState(notExistedStorageUnits.isEmpty(), () -> 
new MissingRequiredStorageUnitsException(databaseName, notExistedStorageUnits));
     }
     
     private void checkInUsed(final String databaseName, final 
UnregisterStorageUnitStatement sqlStatement) {
         ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(databaseName);
-        Map<String, Collection<String>> inUsedStorageUnits = 
StorageUnitUtils.getInUsedStorageUnits(database.getRuleMetaData(), 
database.getResourceMetaData().getDataSources().size());
+        Map<String, Collection<String>> inUsedStorageUnits = 
StorageUnitUtils.getInUsedStorageUnits(
+                database.getRuleMetaData(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources().size());
         Collection<String> inUsedStorageUnitNames = 
inUsedStorageUnits.keySet();
         inUsedStorageUnitNames.retainAll(sqlStatement.getStorageUnitNames());
         if (!inUsedStorageUnitNames.isEmpty()) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/ShowRulesUsedStorageUnitExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/ShowRulesUsedStorageUnitExecutor.java
index be340fb0630..143d26aaf52 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/ShowRulesUsedStorageUnitExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/ShowRulesUsedStorageUnitExecutor.java
@@ -62,7 +62,7 @@ public final class ShowRulesUsedStorageUnitExecutor 
implements RQLExecutor<ShowR
     public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ShowRulesUsedStorageUnitStatement 
sqlStatement) {
         Collection<LocalDataQueryResultRow> result = new LinkedList<>();
         String resourceName = sqlStatement.getStorageUnitName().orElse(null);
-        if 
(database.getResourceMetaData().getDataSources().containsKey(resourceName)) {
+        if 
(database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().containsKey(resourceName))
 {
             result.addAll(getShardingData(database));
             result.addAll(getReadwriteSplittingData(database, resourceName));
             result.addAll(getEncryptData(database));
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/ShowStorageUnitExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/ShowStorageUnitExecutor.java
index a00adc65d75..e2c7713e92c 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/ShowStorageUnitExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/ShowStorageUnitExecutor.java
@@ -92,21 +92,22 @@ public final class ShowStorageUnitExecutor implements 
RQLExecutor<ShowStorageUni
     }
     
     private Map<String, DataSourcePoolProperties> 
getDataSourcePoolPropertiesMap(final ShardingSphereDatabase database, final 
ShowStorageUnitsStatement sqlStatement) {
-        Map<String, DataSourcePoolProperties> result = new 
LinkedHashMap<>(database.getResourceMetaData().getDataSources().size(), 1F);
+        Map<String, DataSourcePoolProperties> result = new 
LinkedHashMap<>(database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().size(),
 1F);
         Map<String, DataSourcePoolProperties> propsMap = 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().entrySet().stream()
                 .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) -> 
currentValue, LinkedHashMap::new));
         Map<String, DatabaseType> storageTypes = 
database.getResourceMetaData().getStorageTypes();
         Optional<Integer> usageCount = sqlStatement.getUsageCount();
         if (usageCount.isPresent()) {
-            Map<String, Collection<String>> inUsedStorageUnits = 
StorageUnitUtils.getInUsedStorageUnits(database.getRuleMetaData(), 
database.getResourceMetaData().getDataSources().size());
-            for (Entry<String, DataSource> entry : 
database.getResourceMetaData().getDataSources().entrySet()) {
+            Map<String, Collection<String>> inUsedStorageUnits = 
StorageUnitUtils.getInUsedStorageUnits(
+                    database.getRuleMetaData(), 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().size());
+            for (Entry<String, DataSource> entry : 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources().entrySet())
 {
                 Integer currentUsageCount = 
inUsedStorageUnits.containsKey(entry.getKey()) ? 
inUsedStorageUnits.get(entry.getKey()).size() : 0;
                 if (usageCount.get().equals(currentUsageCount)) {
                     result.put(entry.getKey(), 
getDataSourcePoolProperties(propsMap, entry.getKey(), 
storageTypes.get(entry.getKey()), entry.getValue()));
                 }
             }
         } else {
-            for (Entry<String, DataSource> entry : 
database.getResourceMetaData().getDataSources().entrySet()) {
+            for (Entry<String, DataSource> entry : 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources().entrySet())
 {
                 result.put(entry.getKey(), 
getDataSourcePoolProperties(propsMap, entry.getKey(), 
storageTypes.get(entry.getKey()), entry.getValue()));
             }
         }
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 e0b5f273bff..2c1748977a1 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
@@ -130,7 +130,7 @@ public final class YamlDatabaseConfigurationImportExecutor {
     private void checkDatabase(final String databaseName) {
         ShardingSpherePreconditions.checkNotNull(databaseName, () -> new 
UnsupportedSQLOperationException("Property `databaseName` in imported config is 
required"));
         if (ProxyContext.getInstance().databaseExists(databaseName)) {
-            
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources().isEmpty(),
+            
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getStorageUnits().isEmpty(),
                     () -> new 
UnsupportedSQLOperationException(String.format("Database `%s` exists and is not 
empty,overwrite is not supported", databaseName)));
         }
     }
@@ -158,7 +158,8 @@ public final class YamlDatabaseConfigurationImportExecutor {
         } catch (final SQLException ex) {
             throw new 
InvalidStorageUnitsException(Collections.singleton(ex.getMessage()));
         }
-        Map<String, DataSource> dataSource = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        Map<String, DataSource> dataSource = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData()
+                
.getDatabase(databaseName).getResourceMetaData().getStorageUnitMetaData().getDataSources();
         propsMap.forEach((key, value) -> dataSource.put(key, 
DataSourcePoolCreator.create(value)));
     }
     
@@ -246,7 +247,7 @@ public final class YamlDatabaseConfigurationImportExecutor {
         InstanceContext instanceContext = 
ProxyContext.getInstance().getContextManager().getInstanceContext();
         shardingRuleConfigImportChecker.check(database, shardingRuleConfig);
         allRuleConfigs.add(shardingRuleConfig);
-        database.getRuleMetaData().getRules().add(new 
ShardingRule(shardingRuleConfig, 
database.getResourceMetaData().getDataSources().keySet(), instanceContext));
+        database.getRuleMetaData().getRules().add(new 
ShardingRule(shardingRuleConfig, 
database.getResourceMetaData().getStorageUnitMetaData().getStorageUnits().keySet(),
 instanceContext));
     }
     
     private void addReadwriteSplittingRuleConfiguration(final 
ReadwriteSplittingRuleConfiguration readwriteSplittingRuleConfig,
@@ -278,12 +279,13 @@ public final class 
YamlDatabaseConfigurationImportExecutor {
     
     private void addBroadcastRuleConfiguration(final 
BroadcastRuleConfiguration broadcastRuleConfig, final 
Collection<RuleConfiguration> allRuleConfigs, final ShardingSphereDatabase 
database) {
         allRuleConfigs.add(broadcastRuleConfig);
-        database.getRuleMetaData().getRules().add(new 
BroadcastRule(broadcastRuleConfig, database.getName(), 
database.getResourceMetaData().getDataSources()));
+        database.getRuleMetaData().getRules().add(new 
BroadcastRule(broadcastRuleConfig, database.getName(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources()));
     }
     
     private void addSingleRuleConfiguration(final SingleRuleConfiguration 
broadcastRuleConfig, final Collection<RuleConfiguration> allRuleConfigs, final 
ShardingSphereDatabase database) {
         allRuleConfigs.add(broadcastRuleConfig);
-        database.getRuleMetaData().getRules().add(new 
SingleRule(broadcastRuleConfig, database.getName(), 
database.getResourceMetaData().getDataSources(), 
database.getRuleMetaData().getRules()));
+        database.getRuleMetaData().getRules().add(
+                new SingleRule(broadcastRuleConfig, database.getName(), 
database.getResourceMetaData().getStorageUnitMetaData().getDataSources(), 
database.getRuleMetaData().getRules()));
     }
     
     private void dropDatabase(final String databaseName) {
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSourceTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSourceTest.java
index f63c406b810..93834d4da6a 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSourceTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/datasource/JDBCBackendDataSourceTest.java
@@ -99,7 +99,7 @@ class JDBCBackendDataSourceTest {
         storageTypes.put("ds_0", databaseType);
         storageTypes.put("ds_1", databaseType);
         
when(database.getResourceMetaData().getStorageTypes()).thenReturn(storageTypes);
-        
when(database.getResourceMetaData().getDataSources()).thenReturn(mockDataSources(2));
+        
when(database.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(mockDataSources(2));
         return Collections.singletonMap("schema", database);
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
index 257c6e4782d..9cfc3c99b0d 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/database/DatabaseOperateBackendHandlerFactoryTest.java
@@ -158,7 +158,6 @@ class DatabaseOperateBackendHandlerFactoryTest {
     
     private MetaDataContexts mockMetaDataContexts() {
         MetaDataContexts result = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        
when(result.getMetaData().getDatabase("foo_db").getResourceMetaData().getDataSources()).thenReturn(Collections.emptyMap());
         
when(result.getMetaData().getDatabase("foo_db").getResourceMetaData().getNotExistedDataSources(any())).thenReturn(Collections.emptyList());
         return result;
     }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
index fc46f8faef0..b167e61aae8 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
@@ -92,7 +92,6 @@ class DistSQLBackendHandlerFactoryTest {
     
     private ShardingSphereDatabase mockDatabase() {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(result.getResourceMetaData().getDataSources()).thenReturn(Collections.emptyMap());
         
when(result.getResourceMetaData().getNotExistedDataSources(any())).thenReturn(Collections.emptyList());
         when(result.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.emptyList()));
         return result;
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
index aeff63e5c8a..7e538738bf1 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
@@ -125,7 +125,7 @@ class ExportStorageNodesExecutorTest {
     @Test
     void assertExecute() {
         when(database.getName()).thenReturn("normal_db");
-        
when(database.getResourceMetaData().getDataSources()).thenReturn(createDataSourceMap());
+        
when(database.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(createDataSourceMap());
         
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createShardingRuleConfiguration()));
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
@@ -138,7 +138,7 @@ class ExportStorageNodesExecutorTest {
     @Test
     void assertExecuteWithDatabaseName() {
         when(database.getName()).thenReturn("normal_db");
-        
when(database.getResourceMetaData().getDataSources()).thenReturn(createDataSourceMap());
+        
when(database.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(createDataSourceMap());
         
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createShardingRuleConfiguration()));
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationUpdaterTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationUpdaterTest.java
index 14d3f6b6a1b..5e1ddde3db7 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationUpdaterTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationUpdaterTest.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.storage.StorageUnitMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.generic.UnsupportedSQLOperationException;
@@ -39,6 +40,8 @@ import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.internal.configuration.plugins.Plugins;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
 
 import java.sql.SQLException;
 import java.util.Collections;
@@ -51,6 +54,7 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith(AutoMockExtension.class)
 @StaticMockSettings(ProxyContext.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 class ImportDatabaseConfigurationUpdaterTest {
     
     private ImportDatabaseConfigurationUpdater importDatabaseConfigUpdater;
@@ -126,6 +130,7 @@ class ImportDatabaseConfigurationUpdaterTest {
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+        
when(resourceMetaData.getStorageUnitMetaData()).thenReturn(mock(StorageUnitMetaData.class));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
         
when(database.getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
index 033973f8aab..cab863a736e 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
@@ -108,7 +108,7 @@ class ImportMetaDataUpdaterTest {
         if (feature != null) {
             ShardingSphereDatabase database = 
mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
             
when(database.getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(new 
ShardingSphereSchema(createTableMap(), Collections.emptyMap()));
-            
when(database.getResourceMetaData().getDataSources()).thenReturn(createDataSourceMap());
+            
when(database.getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(createDataSourceMap());
             
when(result.getMetaDataContexts().getMetaData().getDatabases()).thenReturn(Collections.singletonMap(feature,
 database));
             
when(result.getMetaDataContexts().getMetaData().getDatabase(feature)).thenReturn(database);
         }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
index 3820321cb36..bd97a3e397b 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
@@ -78,8 +78,8 @@ class AlterStorageUnitBackendHandlerTest {
         ContextManager contextManager = 
mockContextManager(mock(MetaDataContexts.class, RETURNS_DEEP_STUBS));
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
-        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("ds_0",
 mockHikariDataSource("ds_0")));
+        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(resourceMetaData.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("ds_0",
 mockHikariDataSource("ds_0")));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         assertThat(handler.execute("foo_db", 
createAlterStorageUnitStatement("ds_0")), 
instanceOf(UpdateResponseHeader.class));
     }
@@ -103,8 +103,8 @@ class AlterStorageUnitBackendHandlerTest {
         ContextManager contextManager = 
mockContextManager(mock(MetaDataContexts.class, RETURNS_DEEP_STUBS));
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
-        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("ds_0",
 mockHikariDataSource("ds_1")));
+        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(resourceMetaData.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("ds_0",
 mockHikariDataSource("ds_1")));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         assertThrows(InvalidStorageUnitsException.class, () -> 
handler.execute("foo_db", createAlterStorageUnitStatement("ds_0")));
     }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
index 4bc36b4711f..335f8c67a01 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
@@ -89,7 +89,7 @@ class UnregisterStorageUnitBackendHandlerTest {
     @BeforeEach
     void setUp() {
         resourceMetaData = mock(ResourceMetaData.class, RETURNS_DEEP_STUBS);
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
+        
when(resourceMetaData.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
         when(database.getRuleMetaData()).thenReturn(ruleMetaData);
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         contextManager = mockContextManager();
@@ -109,7 +109,7 @@ class UnregisterStorageUnitBackendHandlerTest {
     
     @Test
     void assertExecute() throws SQLException {
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
+        
when(resourceMetaData.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
         UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false);
@@ -119,7 +119,7 @@ class UnregisterStorageUnitBackendHandlerTest {
     
     @Test
     void assertStorageUnitNameNotExistedExecute() {
-        
when(ProxyContext.getInstance().getDatabase("foo_db").getResourceMetaData().getDataSources()).thenReturn(Collections.emptyMap());
+        
when(ProxyContext.getInstance().getDatabase("foo_db").getResourceMetaData().getStorageUnitMetaData().getDataSources()).thenReturn(Collections.emptyMap());
         assertThrows(MissingRequiredStorageUnitsException.class,
                 () -> handler.execute("foo_db", new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false)));
     }
@@ -129,7 +129,7 @@ class UnregisterStorageUnitBackendHandlerTest {
         
when(ruleMetaData.findRules(DataSourceContainedRule.class)).thenReturn(Collections.singleton(shadowRule));
         when(shadowRule.getType()).thenReturn("ShadowRule");
         
when(shadowRule.getDataSourceMapper()).thenReturn(Collections.singletonMap("", 
Collections.singleton("foo_ds")));
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
+        
when(resourceMetaData.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
         assertThrows(StorageUnitInUsedException.class,
@@ -143,7 +143,7 @@ class UnregisterStorageUnitBackendHandlerTest {
         DataNode dataNode = mock(DataNode.class);
         when(dataNode.getDataSourceName()).thenReturn("foo_ds");
         
when(singleRule.getAllDataNodes()).thenReturn(Collections.singletonMap("", 
Collections.singleton(dataNode)));
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
+        
when(resourceMetaData.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
         assertThrows(StorageUnitInUsedException.class,
@@ -157,7 +157,7 @@ class UnregisterStorageUnitBackendHandlerTest {
         DataNode dataNode = mock(DataNode.class);
         when(dataNode.getDataSourceName()).thenReturn("foo_ds");
         
when(singleRule.getAllDataNodes()).thenReturn(Collections.singletonMap("", 
Collections.singleton(dataNode)));
-        
when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
+        
when(resourceMetaData.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
         UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), true);
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
index effd4e5e0dd..ad3aa0e4c2a 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
@@ -95,7 +95,8 @@ public final class SelectInformationSchemataExecutor extends 
DefaultDatabaseMeta
     @Override
     protected void preProcess(final String databaseName, final Map<String, 
Object> rows, final Map<String, String> alias) {
         ResourceMetaData resourceMetaData = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
-        Collection<String> catalogs = 
resourceMetaData.getDataSources().keySet().stream().map(each -> 
resourceMetaData.getConnectionProperties(each).getCatalog()).collect(Collectors.toSet());
+        Collection<String> catalogs = 
resourceMetaData.getStorageUnitMetaData().getStorageUnits().keySet()
+                .stream().map(each -> 
resourceMetaData.getConnectionProperties(each).getCatalog()).collect(Collectors.toSet());
         schemaNameAlias = alias.getOrDefault(SCHEMA_NAME, "");
         String rowValue = rows.getOrDefault(schemaNameAlias, "").toString();
         queryDatabase = !rowValue.isEmpty();
diff --git 
a/proxy/bootstrap/src/main/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersion.java
 
b/proxy/bootstrap/src/main/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersion.java
index 4886ed672e5..77cca55965c 100644
--- 
a/proxy/bootstrap/src/main/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersion.java
+++ 
b/proxy/bootstrap/src/main/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersion.java
@@ -74,6 +74,7 @@ public final class ShardingSphereProxyVersion {
     
     private static Optional<DataSource> findDataSourceByProtocolType(final 
String databaseName, final ResourceMetaData resourceMetaData, final 
DatabaseType protocolType) {
         Optional<String> dataSourceName = 
resourceMetaData.getStorageTypes().entrySet().stream().filter(entry -> 
entry.getValue().equals(protocolType)).map(Entry::getKey).findFirst();
-        return dataSourceName.flatMap(optional -> 
Optional.ofNullable(DataSourceStateManager.getInstance().getEnabledDataSources(databaseName,
 resourceMetaData.getDataSources()).get(optional)));
+        return dataSourceName.flatMap(optional -> Optional.ofNullable(
+                
DataSourceStateManager.getInstance().getEnabledDataSources(databaseName, 
resourceMetaData.getStorageUnitMetaData().getDataSources()).get(optional)));
     }
 }
diff --git 
a/proxy/bootstrap/src/test/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersionTest.java
 
b/proxy/bootstrap/src/test/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersionTest.java
index 2fa4cd21ae4..c20b67edbc3 100644
--- 
a/proxy/bootstrap/src/test/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersionTest.java
+++ 
b/proxy/bootstrap/src/test/java/org/apache/shardingsphere/proxy/version/ShardingSphereProxyVersionTest.java
@@ -77,10 +77,10 @@ class ShardingSphereProxyVersionTest {
     }
     
     private ResourceMetaData mockResourceMetaData(final String 
databaseProductName, final String databaseProductVersion) throws SQLException {
-        ResourceMetaData result = mock(ResourceMetaData.class);
+        ResourceMetaData result = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         
when(result.getStorageTypes()).thenReturn(Collections.singletonMap("foo_ds", 
TypedSPILoader.getService(DatabaseType.class, databaseProductName)));
         DataSource dataSource = createDataSource(databaseProductName, 
databaseProductVersion);
-        
when(result.getDataSources()).thenReturn(Collections.singletonMap("foo_ds", 
dataSource));
+        
when(result.getStorageUnitMetaData().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 dataSource));
         return result;
     }
     
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 99042c9442d..15f8c353fdf 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
@@ -86,6 +86,7 @@ import java.util.stream.Stream;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -119,7 +120,7 @@ public abstract class SQLRewriterIT {
         mockDataSource(databaseConfig.getDataSources());
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, testParams.getDatabaseType());
         Map<String, DatabaseType> storageTypes = 
createStorageTypes(databaseConfig, databaseType);
-        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         when(resourceMetaData.getStorageTypes()).thenReturn(storageTypes);
         String schemaName = new 
DatabaseTypeRegistry(databaseType).getDefaultSchemaName(DefaultDatabase.LOGIC_NAME);
         SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine(TypedSPILoader.getService(DatabaseType.class, 
testParams.getDatabaseType()),

Reply via email to