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

zhangliang 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 750cf3b5126 Change the key of storageNodeDataSources from String to 
StorageNode (#28031)
750cf3b5126 is described below

commit 750cf3b51262a46a7ad0248834262e8fc5ccda51
Author: Raigor <raigor.ji...@gmail.com>
AuthorDate: Fri Aug 11 10:05:44 2023 +0800

    Change the key of storageNodeDataSources from String to StorageNode (#28031)
    
    * Change the key of storageNodeDataSources from String to StorageNode
    
    * merge master
    
    * Optimize StorageUnitMetaData
---
 .../DataSourceProvidedDatabaseConfiguration.java   |  4 +-
 .../database/resource/ResourceMetaData.java        | 32 +++-------
 .../database/resource/StorageUnitMetaData.java     | 66 ++++++++++---------
 ...taSourceGeneratedDatabaseConfigurationTest.java |  3 +-
 ...ataSourceProvidedDatabaseConfigurationTest.java |  3 +-
 .../pool/creator/DataSourcePoolCreator.java        | 28 ++++----
 .../pool/props/DataSourcePropertiesCreator.java    |  6 +-
 .../infra/datasource/storage/StorageNode.java}     | 31 +++++++--
 .../datasource/storage/StorageNodeProperties.java  |  5 +-
 .../infra/datasource/storage/StorageResource.java  |  8 +--
 ...StorageUtils.java => StorageResourceUtils.java} | 18 +++++-
 .../storage/StorageResourceWithProperties.java     |  2 +-
 .../datasource/storage/StorageUnitNodeMapper.java  | 10 +--
 .../datasource/ShardingSphereDataSourceTest.java   | 13 ++--
 .../metadata/persist/MetaDataPersistService.java   | 13 ++--
 .../persist/NewMetaDataPersistService.java         | 13 ++--
 .../context/ConfigurationContextManager.java       | 17 ++---
 .../manager/switcher/NewResourceSwitchManager.java | 27 ++++----
 .../manager/switcher/ResourceSwitchManager.java    | 74 ++++++++++++----------
 .../mode/manager/switcher/SwitchingResource.java   |  2 +-
 .../mode/manager/ContextManagerTest.java           | 13 ++--
 .../switcher/ResourceSwitchManagerTest.java        | 13 ++--
 .../manager/switcher/SwitchingResourceTest.java    |  5 +-
 .../ConfigurationChangedSubscriberTest.java        |  2 +-
 .../swapper/YamlProxyConfigurationSwapperTest.java |  3 +-
 25 files changed, 227 insertions(+), 184 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
index 2fef26164ef..f3a92b9cc05 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourcePropertiesCreator;
 import org.apache.shardingsphere.infra.datasource.storage.StorageResource;
-import org.apache.shardingsphere.infra.datasource.storage.StorageUtils;
+import org.apache.shardingsphere.infra.datasource.storage.StorageResourceUtils;
 
 import javax.sql.DataSource;
 import java.util.Collection;
@@ -46,7 +46,7 @@ public final class DataSourceProvidedDatabaseConfiguration 
implements DatabaseCo
     
     public DataSourceProvidedDatabaseConfiguration(final Map<String, 
DataSource> dataSources, final Collection<RuleConfiguration> 
ruleConfigurations) {
         this.ruleConfigurations = ruleConfigurations;
-        this.storageResource = new StorageResource(dataSources, 
StorageUtils.getStorageUnitNodeMappers(dataSources));
+        this.storageResource = new 
StorageResource(StorageResourceUtils.getStorageNodeDataSources(dataSources), 
StorageResourceUtils.getStorageUnitNodeMappers(dataSources));
         dataSourcePropsMap = createDataSourcePropertiesMap(dataSources);
     }
     
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 6a255dc4a67..fc6e62918a3 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
@@ -18,19 +18,17 @@
 package org.apache.shardingsphere.infra.metadata.database.resource;
 
 import lombok.Getter;
-import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import 
org.apache.shardingsphere.infra.database.core.connector.ConnectionProperties;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
+import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourcePropertiesCreator;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.datasource.storage.StorageResource;
-import org.apache.shardingsphere.infra.datasource.storage.StorageUtils;
-import org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager;
+import org.apache.shardingsphere.infra.datasource.storage.StorageResourceUtils;
 
 import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -42,7 +40,7 @@ import java.util.stream.Collectors;
 @Getter
 public final class ResourceMetaData {
     
-    private final StorageNodeMetaData storageNodeMetaData;
+    private final Map<StorageNode, DataSource> storageNodeDataSources;
     
     private final StorageUnitMetaData storageUnitMetaData;
     
@@ -51,26 +49,14 @@ public final class ResourceMetaData {
     }
     
     public ResourceMetaData(final String databaseName, final Map<String, 
DataSource> dataSources) {
-        Map<String, DataSource> enabledDataSources = 
DataSourceStateManager.getInstance().getEnabledDataSources(databaseName, 
dataSources);
-        Map<String, DatabaseType> storageTypes = 
createStorageTypes(dataSources, enabledDataSources);
-        storageNodeMetaData = new StorageNodeMetaData(dataSources);
-        storageUnitMetaData = new StorageUnitMetaData(dataSources, 
storageTypes, StorageUtils.getStorageUnitNodeMappers(dataSources), 
enabledDataSources);
-        
+        storageNodeDataSources = 
StorageResourceUtils.getStorageNodeDataSources(dataSources);
+        storageUnitMetaData = new StorageUnitMetaData(databaseName, 
storageNodeDataSources,
+                DataSourcePropertiesCreator.create(dataSources), 
StorageResourceUtils.getStorageUnitNodeMappers(dataSources));
     }
     
     public ResourceMetaData(final String databaseName, final StorageResource 
storageResource, final Map<String, DataSourceProperties> dataSourcePropsMap) {
-        Map<String, DataSource> enabledDataSources = 
DataSourceStateManager.getInstance().getEnabledDataSources(databaseName, 
storageResource.getStorageNodes());
-        Map<String, DatabaseType> storageTypes = 
createStorageTypes(storageResource.getStorageNodes(), enabledDataSources);
-        storageNodeMetaData = new 
StorageNodeMetaData(storageResource.getStorageNodes());
-        storageUnitMetaData = new 
StorageUnitMetaData(storageResource.getStorageNodes(), dataSourcePropsMap, 
storageTypes, storageResource.getStorageUnitNodeMappers(), enabledDataSources);
-    }
-    
-    private Map<String, DatabaseType> createStorageTypes(final Map<String, 
DataSource> dataSources, final Map<String, DataSource> enabledDataSources) {
-        Map<String, DatabaseType> result = new 
LinkedHashMap<>(dataSources.size(), 1F);
-        for (Entry<String, DataSource> entry : dataSources.entrySet()) {
-            result.put(entry.getKey(), 
DatabaseTypeEngine.getStorageType(enabledDataSources.containsKey(entry.getKey())
 ? Collections.singleton(entry.getValue()) : Collections.emptyList()));
-        }
-        return result;
+        storageNodeDataSources = storageResource.getStorageNodeDataSources();
+        storageUnitMetaData = new StorageUnitMetaData(databaseName, 
storageNodeDataSources, dataSourcePropsMap, 
storageResource.getStorageUnitNodeMappers());
     }
     
     /**
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/StorageUnitMetaData.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/StorageUnitMetaData.java
index f7196b8488b..d833e196276 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/StorageUnitMetaData.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/StorageUnitMetaData.java
@@ -19,20 +19,23 @@ package 
org.apache.shardingsphere.infra.metadata.database.resource;
 
 import lombok.Getter;
 import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
-import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.database.core.connector.ConnectionProperties;
 import 
org.apache.shardingsphere.infra.database.core.connector.ConnectionPropertiesParser;
+import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.datasource.CatalogSwitchableDataSource;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourcePropertiesCreator;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageUnitNodeMapper;
+import org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager;
 
 import javax.sql.DataSource;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 /**
  * Storage unit meta data.
@@ -50,48 +53,53 @@ public final class StorageUnitMetaData {
     
     private final Map<String, ConnectionProperties> connectionPropsMap;
     
-    public StorageUnitMetaData(final Map<String, DataSource> dataSources, 
final Map<String, DatabaseType> storageTypes, final Map<String, 
StorageUnitNodeMapper> unitNodeMappers,
-                               final Map<String, DataSource> 
enabledDataSources) {
-        this(dataSources, DataSourcePropertiesCreator.create(dataSources), 
storageTypes, unitNodeMappers, enabledDataSources);
-    }
-    
-    public StorageUnitMetaData(final Map<String, DataSource> dataSources, 
final Map<String, DataSourceProperties> dataSourcePropsMap,
-                               final Map<String, DatabaseType> storageTypes, 
final Map<String, StorageUnitNodeMapper> unitNodeMappers, final Map<String, 
DataSource> enabledDataSources) {
+    public StorageUnitMetaData(final String databaseName, final 
Map<StorageNode, DataSource> storageNodeDataSources,
+                               final Map<String, DataSourceProperties> 
dataSourcePropsMap, final Map<String, StorageUnitNodeMapper> unitNodeMappers) {
         this.unitNodeMappers = unitNodeMappers;
-        this.dataSources = getStorageUnitDataSources(dataSources, 
unitNodeMappers);
+        this.dataSources = getStorageUnitDataSources(storageNodeDataSources, 
unitNodeMappers);
         this.dataSourcePropsMap = dataSourcePropsMap;
-        this.storageTypes = getStorageUnitTypes(storageTypes);
-        connectionPropsMap = createConnectionPropertiesMap(enabledDataSources, 
storageTypes, unitNodeMappers);
+        Map<StorageNode, DataSource> enabledStorageNodeDataSources = 
getEnabledStorageNodeDataSources(databaseName, storageNodeDataSources);
+        storageTypes = createStorageTypes(enabledStorageNodeDataSources, 
unitNodeMappers);
+        connectionPropsMap = 
createConnectionPropertiesMap(enabledStorageNodeDataSources, storageTypes, 
unitNodeMappers);
     }
     
-    private Map<String, DataSource> getStorageUnitDataSources(final 
Map<String, DataSource> storageNodes, final Map<String, StorageUnitNodeMapper> 
storageUnits) {
-        Map<String, DataSource> result = new 
LinkedHashMap<>(storageUnits.size(), 1F);
-        for (Entry<String, StorageUnitNodeMapper> entry : 
storageUnits.entrySet()) {
-            DataSource dataSource = 
storageNodes.get(entry.getValue().getNodeName());
+    private Map<StorageNode, DataSource> 
getEnabledStorageNodeDataSources(final String databaseName, final 
Map<StorageNode, DataSource> storageNodeDataSources) {
+        Map<String, DataSource> toBeCheckedDataSources = new 
LinkedHashMap<>(storageNodeDataSources.size(), 1F);
+        for (Entry<StorageNode, DataSource> entry : 
storageNodeDataSources.entrySet()) {
+            toBeCheckedDataSources.put(entry.getKey().getName(), 
entry.getValue());
+        }
+        Map<String, DataSource> enabledDataSources = 
DataSourceStateManager.getInstance().getEnabledDataSources(databaseName, 
toBeCheckedDataSources);
+        return storageNodeDataSources.entrySet().stream()
+                .filter(entry -> 
enabledDataSources.containsKey(entry.getKey().getName())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
+    }
+    
+    private Map<String, DataSource> getStorageUnitDataSources(final 
Map<StorageNode, DataSource> storageNodeDataSources, final Map<String, 
StorageUnitNodeMapper> unitNodeMappers) {
+        Map<String, DataSource> result = new 
LinkedHashMap<>(unitNodeMappers.size(), 1F);
+        for (Entry<String, StorageUnitNodeMapper> entry : 
unitNodeMappers.entrySet()) {
+            DataSource dataSource = 
storageNodeDataSources.get(entry.getValue().getStorageNode());
             result.put(entry.getKey(), new 
CatalogSwitchableDataSource(dataSource, entry.getValue().getCatalog(), 
entry.getValue().getUrl()));
         }
         return result;
     }
     
-    private Map<String, DatabaseType> getStorageUnitTypes(final Map<String, 
DatabaseType> storageTypes) {
+    private Map<String, DatabaseType> createStorageTypes(final 
Map<StorageNode, DataSource> enabledStorageNodeDataSources, final Map<String, 
StorageUnitNodeMapper> unitNodeMappers) {
         Map<String, DatabaseType> result = new 
LinkedHashMap<>(unitNodeMappers.size(), 1F);
         for (Entry<String, StorageUnitNodeMapper> entry : 
unitNodeMappers.entrySet()) {
-            DatabaseType storageType = 
storageTypes.containsKey(entry.getValue().getNodeName())
-                    ? storageTypes.get(entry.getValue().getNodeName())
-                    : 
DatabaseTypeEngine.getStorageType(Collections.emptyList());
-            result.put(entry.getKey(), storageType);
+            result.put(entry.getKey(), 
DatabaseTypeEngine.getStorageType(enabledStorageNodeDataSources.containsKey(entry.getValue().getStorageNode())
+                    ? 
Collections.singleton(enabledStorageNodeDataSources.get(entry.getValue().getStorageNode()))
+                    : Collections.emptyList()));
         }
         return result;
     }
     
-    private Map<String, ConnectionProperties> 
createConnectionPropertiesMap(final Map<String, DataSource> enabledDataSources,
-                                                                            
final Map<String, DatabaseType> storageTypes, final Map<String, 
StorageUnitNodeMapper> storageUnits) {
-        Map<String, ConnectionProperties> result = new 
LinkedHashMap<>(storageUnits.size(), 1F);
-        for (Entry<String, StorageUnitNodeMapper> entry : 
storageUnits.entrySet()) {
-            String nodeName = entry.getValue().getNodeName();
-            if (enabledDataSources.containsKey(nodeName)) {
-                Map<String, Object> standardProps = 
DataSourcePropertiesCreator.create(enabledDataSources.get(nodeName)).getConnectionPropertySynonyms().getStandardProperties();
-                DatabaseType storageType = storageTypes.get(nodeName);
+    private Map<String, ConnectionProperties> 
createConnectionPropertiesMap(final Map<StorageNode, DataSource> 
enabledStorageNodeDataSources,
+                                                                            
final Map<String, DatabaseType> storageTypes, final Map<String, 
StorageUnitNodeMapper> unitNodeMappers) {
+        Map<String, ConnectionProperties> result = new 
LinkedHashMap<>(unitNodeMappers.size(), 1F);
+        for (Entry<String, StorageUnitNodeMapper> entry : 
unitNodeMappers.entrySet()) {
+            if 
(enabledStorageNodeDataSources.containsKey(entry.getValue().getStorageNode())) {
+                Map<String, Object> standardProps = 
DataSourcePropertiesCreator.create(enabledStorageNodeDataSources.get(entry.getValue().getStorageNode()))
+                        
.getConnectionPropertySynonyms().getStandardProperties();
+                DatabaseType storageType = storageTypes.get(entry.getKey());
                 ConnectionPropertiesParser parser = 
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class, 
storageType);
                 result.put(entry.getKey(), 
parser.parse(standardProps.get("url").toString(), 
standardProps.get("username").toString(), entry.getValue().getCatalog()));
             }
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
index ae9b02039ae..cba32437cf8 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.datasource.pool.config.ConnectionConfigur
 import 
org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.config.PoolConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.fixture.FixtureRuleConfiguration;
 import org.junit.jupiter.api.Test;
 
@@ -49,7 +50,7 @@ class DataSourceGeneratedDatabaseConfigurationTest {
     @Test
     void assertGetStorageNodes() {
         DataSourceGeneratedDatabaseConfiguration databaseConfig = 
createDataSourceGeneratedDatabaseConfiguration();
-        HikariDataSource hikariDataSource = (HikariDataSource) 
databaseConfig.getStorageResource().getStorageNodes().get("normal_db");
+        HikariDataSource hikariDataSource = (HikariDataSource) 
databaseConfig.getStorageResource().getStorageNodeDataSources().get(new 
StorageNode("normal_db"));
         assertThat(hikariDataSource.getJdbcUrl(), 
is("jdbc:mock://127.0.0.1/normal_db"));
         assertThat(hikariDataSource.getUsername(), is("root"));
         assertThat(hikariDataSource.getPassword(), is(""));
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
index fa036944365..635a45601ce 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.infra.config.database.impl;
 
 import org.apache.shardingsphere.infra.datasource.CatalogSwitchableDataSource;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.fixture.FixtureRuleConfiguration;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.junit.jupiter.api.Test;
@@ -44,7 +45,7 @@ class DataSourceProvidedDatabaseConfigurationTest {
     @Test
     void assertGetStorageNodes() {
         DataSourceProvidedDatabaseConfiguration databaseConfig = 
createDataSourceProvidedDatabaseConfiguration();
-        MockedDataSource dataSource = (MockedDataSource) 
databaseConfig.getStorageResource().getStorageNodes().get("foo_ds");
+        MockedDataSource dataSource = (MockedDataSource) 
databaseConfig.getStorageResource().getStorageNodeDataSources().get(new 
StorageNode("foo_ds"));
         assertThat(dataSource.getUrl(), is("jdbc:mock://127.0.0.1/foo_ds"));
         assertThat(dataSource.getUsername(), is("root"));
         assertThat(dataSource.getPassword(), is("root"));
diff --git 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
index 26ecf9b22b0..4e27fe74fcb 100644
--- 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/creator/DataSourcePoolCreator.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMe
 import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaDataReflection;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.custom.CustomDataSourceProperties;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageNodeProperties;
 import org.apache.shardingsphere.infra.datasource.storage.StorageResource;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageResourceWithProperties;
@@ -70,11 +71,12 @@ public final class DataSourcePoolCreator {
      * @return created storage resource
      */
     public static StorageResource createStorageResource(final Map<String, 
DataSourceProperties> dataSourcePropsMap, final boolean cacheEnabled) {
-        Map<String, DataSource> storageNodes = new LinkedHashMap<>();
+        Map<StorageNode, DataSource> storageNodes = new LinkedHashMap<>();
         Map<String, StorageUnitNodeMapper> storageUnitNodeMappers = new 
LinkedHashMap<>();
         for (Entry<String, DataSourceProperties> entry : 
dataSourcePropsMap.entrySet()) {
             StorageNodeProperties storageNodeProps = 
getStorageNodeProperties(entry.getKey(), entry.getValue());
-            if (storageNodes.containsKey(storageNodeProps.getName())) {
+            StorageNode storageNode = new 
StorageNode(storageNodeProps.getName());
+            if (storageNodes.containsKey(storageNode)) {
                 appendStorageUnitNodeMapper(storageUnitNodeMappers, 
storageNodeProps, entry.getKey(), entry.getValue());
                 continue;
             }
@@ -89,7 +91,7 @@ public final class DataSourcePoolCreator {
                 }
                 throw ex;
             }
-            storageNodes.put(storageNodeProps.getName(), dataSource);
+            storageNodes.put(storageNode, dataSource);
             appendStorageUnitNodeMapper(storageUnitNodeMappers, 
storageNodeProps, entry.getKey(), entry.getValue());
         }
         return new StorageResource(storageNodes, storageUnitNodeMappers);
@@ -102,16 +104,17 @@ public final class DataSourcePoolCreator {
      * @return created storage resource
      */
     public static StorageResourceWithProperties 
createStorageResourceWithoutDataSource(final Map<String, DataSourceProperties> 
dataSourcePropsMap) {
-        Map<String, DataSource> storageNodes = new LinkedHashMap<>();
+        Map<StorageNode, DataSource> storageNodes = new LinkedHashMap<>();
         Map<String, StorageUnitNodeMapper> storageUnitNodeMappers = new 
LinkedHashMap<>();
         Map<String, DataSourceProperties> dataSourcePropertiesMap = new 
LinkedHashMap<>();
         for (Entry<String, DataSourceProperties> entry : 
dataSourcePropsMap.entrySet()) {
             StorageNodeProperties storageNodeProperties = 
getStorageNodeProperties(entry.getKey(), entry.getValue());
-            if (storageNodes.containsKey(storageNodeProperties.getName())) {
+            StorageNode storageNode = new 
StorageNode(storageNodeProperties.getName());
+            if (storageNodes.containsKey(storageNode)) {
                 appendStorageUnitNodeMapper(storageUnitNodeMappers, 
storageNodeProperties, entry.getKey(), entry.getValue());
                 continue;
             }
-            storageNodes.put(storageNodeProperties.getName(), null);
+            storageNodes.put(storageNode, null);
             appendStorageUnitNodeMapper(storageUnitNodeMappers, 
storageNodeProperties, entry.getKey(), entry.getValue());
             dataSourcePropertiesMap.put(storageNodeProperties.getName(), 
entry.getValue());
         }
@@ -127,8 +130,8 @@ public final class DataSourcePoolCreator {
     private static StorageUnitNodeMapper getStorageUnitNodeMapper(final 
StorageNodeProperties storageNodeProps, final String unitName, final String 
url) {
         DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(storageNodeProps.getDatabaseType()).getDialectDatabaseMetaData();
         return dialectDatabaseMetaData.isInstanceConnectionAvailable()
-                ? new StorageUnitNodeMapper(unitName, 
storageNodeProps.getName(), storageNodeProps.getDatabase(), url)
-                : new StorageUnitNodeMapper(unitName, 
storageNodeProps.getName(), url);
+                ? new StorageUnitNodeMapper(unitName, new 
StorageNode(storageNodeProps.getName()), storageNodeProps.getCatalog(), url)
+                : new StorageUnitNodeMapper(unitName, new 
StorageNode(storageNodeProps.getName()), url);
     }
     
     private static StorageNodeProperties getStorageNodeProperties(final String 
dataSourceName, final DataSourceProperties storageNodeProps) {
@@ -136,18 +139,17 @@ public final class DataSourcePoolCreator {
         String url = standardProperties.get("url").toString();
         String username = standardProperties.get("username").toString();
         DatabaseType databaseType = DatabaseTypeFactory.get(url);
-        return getStorageNodeProperties(dataSourceName, storageNodeProps, url, 
username, databaseType);
+        return getStorageNodeProperties(dataSourceName, url, username, 
databaseType);
     }
     
-    private static StorageNodeProperties getStorageNodeProperties(final String 
dataSourceName, final DataSourceProperties dataSourceProps,
-                                                                  final String 
url, final String username, final DatabaseType databaseType) {
+    private static StorageNodeProperties getStorageNodeProperties(final String 
dataSourceName, final String url, final String username, final DatabaseType 
databaseType) {
         try {
             JdbcUrl jdbcUrl = new StandardJdbcUrlParser().parse(url);
             DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData();
             String nodeName = 
dialectDatabaseMetaData.isInstanceConnectionAvailable() ? 
generateStorageNodeName(jdbcUrl.getHostname(), jdbcUrl.getPort(), username) : 
dataSourceName;
-            return new StorageNodeProperties(nodeName, databaseType, 
dataSourceProps, jdbcUrl.getDatabase());
+            return new StorageNodeProperties(nodeName, databaseType, 
jdbcUrl.getDatabase());
         } catch (final UnrecognizedDatabaseURLException ex) {
-            return new StorageNodeProperties(dataSourceName, databaseType, 
dataSourceProps, null);
+            return new StorageNodeProperties(dataSourceName, databaseType, 
null);
         }
     }
     
diff --git 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/props/DataSourcePropertiesCreator.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/props/DataSourcePropertiesCreator.java
index 1c7053e6407..536cbe10e59 100644
--- 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/props/DataSourcePropertiesCreator.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/props/DataSourcePropertiesCreator.java
@@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.datasource.pool.config.ConnectionConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.config.PoolConfiguration;
+import org.apache.shardingsphere.infra.datasource.CatalogSwitchableDataSource;
 import 
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourceReflection;
 import 
org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.custom.CustomDataSourceProperties;
@@ -85,7 +86,10 @@ public final class DataSourcePropertiesCreator {
      * @return created data source properties
      */
     public static DataSourceProperties create(final DataSource dataSource) {
-        return new DataSourceProperties(dataSource.getClass().getName(), 
createProperties(dataSource));
+        return dataSource instanceof CatalogSwitchableDataSource
+                ? new DataSourceProperties(((CatalogSwitchableDataSource) 
dataSource).getDataSource().getClass().getName(),
+                        createProperties(((CatalogSwitchableDataSource) 
dataSource).getDataSource()))
+                : new DataSourceProperties(dataSource.getClass().getName(), 
createProperties(dataSource));
     }
     
     @SuppressWarnings({"unchecked", "rawtypes"})
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/StorageNodeMetaData.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageNode.java
similarity index 59%
rename from 
infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/StorageNodeMetaData.java
rename to 
infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageNode.java
index 7fca766ca1b..32c4c3d1d9c 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/StorageNodeMetaData.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageNode.java
@@ -15,20 +15,37 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.database.resource;
+package org.apache.shardingsphere.infra.datasource.storage;
 
+import com.google.common.base.Objects;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
-import javax.sql.DataSource;
-import java.util.Map;
-
 /**
- * Storage node meta data.
+ * Storage node.
  */
 @RequiredArgsConstructor
 @Getter
-public final class StorageNodeMetaData {
+public final class StorageNode {
+    
+    private final String name;
+    
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj instanceof StorageNode) {
+            StorageNode storageNode = (StorageNode) obj;
+            return storageNode.name.equalsIgnoreCase(name);
+        }
+        return false;
+    }
+    
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(name.toUpperCase());
+    }
     
-    private final Map<String, DataSource> dataSources;
+    @Override
+    public String toString() {
+        return name;
+    }
 }
diff --git 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageNodeProperties.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageNodeProperties.java
index a436adaab10..4721882c997 100644
--- 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageNodeProperties.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageNodeProperties.java
@@ -21,7 +21,6 @@ import com.google.common.base.Objects;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
 
 /**
  * Storage node properties.
@@ -34,9 +33,7 @@ public final class StorageNodeProperties {
     
     private final DatabaseType databaseType;
     
-    private final DataSourceProperties dataSourceProperties;
-    
-    private final String database;
+    private final String catalog;
     
     @Override
     public boolean equals(final Object obj) {
diff --git 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResource.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResource.java
index 5d708acac26..856bb30b267 100644
--- 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResource.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResource.java
@@ -31,14 +31,14 @@ import java.util.Map.Entry;
 @Getter
 public class StorageResource {
     
-    private final Map<String, DataSource> storageNodes;
+    private final Map<StorageNode, DataSource> storageNodeDataSources;
     
     private final Map<String, StorageUnitNodeMapper> storageUnitNodeMappers;
     
     private final Map<String, DataSource> wrappedDataSources;
     
-    public StorageResource(final Map<String, DataSource> storageNodes, final 
Map<String, StorageUnitNodeMapper> storageUnitNodeMappers) {
-        this.storageNodes = storageNodes;
+    public StorageResource(final Map<StorageNode, DataSource> 
storageNodeDataSources, final Map<String, StorageUnitNodeMapper> 
storageUnitNodeMappers) {
+        this.storageNodeDataSources = storageNodeDataSources;
         this.storageUnitNodeMappers = storageUnitNodeMappers;
         wrappedDataSources = createWrappedDataSources();
     }
@@ -46,7 +46,7 @@ public class StorageResource {
     private Map<String, DataSource> createWrappedDataSources() {
         Map<String, DataSource> result = new 
LinkedHashMap<>(storageUnitNodeMappers.size(), 1F);
         for (Entry<String, StorageUnitNodeMapper> entry : 
storageUnitNodeMappers.entrySet()) {
-            DataSource dataSource = 
storageNodes.get(entry.getValue().getNodeName());
+            DataSource dataSource = 
storageNodeDataSources.get(entry.getValue().getStorageNode());
             if (null != dataSource) {
                 result.put(entry.getKey(), new 
CatalogSwitchableDataSource(dataSource, entry.getValue().getCatalog(), 
entry.getValue().getUrl()));
             }
diff --git 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageUtils.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResourceUtils.java
similarity index 76%
rename from 
infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageUtils.java
rename to 
infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResourceUtils.java
index 47b86c6319a..21bd6b72aba 100644
--- 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageUtils.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResourceUtils.java
@@ -31,7 +31,21 @@ import java.util.Map.Entry;
  * Storage utility class.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class StorageUtils {
+public final class StorageResourceUtils {
+    
+    /**
+     * Get storage node data sources.
+     *
+     * @param dataSources data sources
+     * @return storage node data sources
+     */
+    public static Map<StorageNode, DataSource> getStorageNodeDataSources(final 
Map<String, DataSource> dataSources) {
+        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(dataSources.size(), 1F);
+        for (Entry<String, DataSource> entry : dataSources.entrySet()) {
+            result.put(new StorageNode(entry.getKey()), entry.getValue());
+        }
+        return result;
+    }
     
     /**
      * Get storage unit node mappers from provided data sources.
@@ -44,7 +58,7 @@ public final class StorageUtils {
         for (Entry<String, DataSource> entry : dataSources.entrySet()) {
             DataSourceProperties dataSourceProperties = 
DataSourcePropertiesCreator.create(entry.getValue());
             String url = 
dataSourceProperties.getConnectionPropertySynonyms().getStandardProperties().get("url").toString();
-            result.put(entry.getKey(), new 
StorageUnitNodeMapper(entry.getKey(), entry.getKey(), url));
+            result.put(entry.getKey(), new 
StorageUnitNodeMapper(entry.getKey(), new StorageNode(entry.getKey()), url));
         }
         return result;
     }
diff --git 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResourceWithProperties.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResourceWithProperties.java
index 3e46055ba79..fc93e7e4d5c 100644
--- 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResourceWithProperties.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageResourceWithProperties.java
@@ -31,7 +31,7 @@ public final class StorageResourceWithProperties extends 
StorageResource {
     
     private final Map<String, DataSourceProperties> dataSourcePropertiesMap;
     
-    public StorageResourceWithProperties(final Map<String, DataSource> 
storageNodes,
+    public StorageResourceWithProperties(final Map<StorageNode, DataSource> 
storageNodes,
                                          final Map<String, 
StorageUnitNodeMapper> storageUnitNodeMappers, final Map<String, 
DataSourceProperties> dataSourcePropertiesMap) {
         super(storageNodes, storageUnitNodeMappers);
         this.dataSourcePropertiesMap = dataSourcePropertiesMap;
diff --git 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageUnitNodeMapper.java
 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageUnitNodeMapper.java
index 76f45297b70..1e41a0f24f3 100644
--- 
a/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageUnitNodeMapper.java
+++ 
b/infra/datasource/core/src/main/java/org/apache/shardingsphere/infra/datasource/storage/StorageUnitNodeMapper.java
@@ -30,21 +30,21 @@ public final class StorageUnitNodeMapper {
     
     private final String name;
     
-    private final String nodeName;
+    private final StorageNode storageNode;
     
     private final String catalog;
     
     private final String url;
     
-    public StorageUnitNodeMapper(final String name, final String nodeName, 
final String url) {
-        this(name, nodeName, null, url);
+    public StorageUnitNodeMapper(final String name, final StorageNode 
storageNode, final String url) {
+        this(name, storageNode, null, url);
     }
     
     @Override
     public boolean equals(final Object obj) {
         if (obj instanceof StorageUnitNodeMapper) {
             StorageUnitNodeMapper storageUnitNodeMapper = 
(StorageUnitNodeMapper) obj;
-            return storageUnitNodeMapper.name.equalsIgnoreCase(name) && 
storageUnitNodeMapper.nodeName.equalsIgnoreCase(nodeName) && 
isSameCatalog(storageUnitNodeMapper);
+            return storageUnitNodeMapper.name.equalsIgnoreCase(name) && 
storageUnitNodeMapper.storageNode.equals(storageNode) && 
isSameCatalog(storageUnitNodeMapper);
         }
         return false;
     }
@@ -55,6 +55,6 @@ public final class StorageUnitNodeMapper {
     
     @Override
     public int hashCode() {
-        return Objects.hashCode(name.toUpperCase(), nodeName.toUpperCase(), 
null == catalog ? null : catalog.toUpperCase());
+        return Objects.hashCode(name.toUpperCase(), 
storageNode.getName().toUpperCase(), null == catalog ? null : 
catalog.toUpperCase());
     }
 }
diff --git 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java
 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java
index ebee0d67c9e..2d8d561d1ae 100644
--- 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java
+++ 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java
@@ -22,6 +22,7 @@ import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
 import org.apache.shardingsphere.infra.state.cluster.ClusterState;
 import org.apache.shardingsphere.infra.state.instance.InstanceState;
@@ -131,9 +132,9 @@ class ShardingSphereDataSourceTest {
         try (HikariDataSource dataSource = createHikariDataSource()) {
             ShardingSphereDataSource actual = 
createShardingSphereDataSource(dataSource);
             actual.close();
-            Map<String, DataSource> dataSourceMap = 
getContextManager(actual).getMetaDataContexts().getMetaData()
-                    
.getDatabase(DefaultDatabase.LOGIC_NAME).getResourceMetaData().getStorageNodeMetaData().getDataSources();
-            assertTrue(((HikariDataSource) 
dataSourceMap.get("ds")).isClosed());
+            Map<StorageNode, DataSource> dataSourceMap = 
getContextManager(actual).getMetaDataContexts().getMetaData()
+                    
.getDatabase(DefaultDatabase.LOGIC_NAME).getResourceMetaData().getStorageNodeDataSources();
+            assertTrue(((HikariDataSource) dataSourceMap.get(new 
StorageNode("ds"))).isClosed());
         }
     }
     
@@ -142,9 +143,9 @@ class ShardingSphereDataSourceTest {
         try (HikariDataSource dataSource = createHikariDataSource()) {
             ShardingSphereDataSource actual = 
createShardingSphereDataSource(dataSource);
             actual.close(Collections.singleton("ds"));
-            Map<String, DataSource> dataSourceMap = 
getContextManager(actual).getMetaDataContexts().getMetaData()
-                    
.getDatabase(DefaultDatabase.LOGIC_NAME).getResourceMetaData().getStorageNodeMetaData().getDataSources();
-            assertTrue(((HikariDataSource) 
dataSourceMap.get("ds")).isClosed());
+            Map<StorageNode, DataSource> dataSourceMap = 
getContextManager(actual).getMetaDataContexts().getMetaData()
+                    
.getDatabase(DefaultDatabase.LOGIC_NAME).getResourceMetaData().getStorageNodeDataSources();
+            assertTrue(((HikariDataSource) dataSourceMap.get(new 
StorageNode("ds"))).isClosed());
         }
     }
     
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
index 2e105276c89..ce68f84ca42 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolD
 import 
org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourcePropertiesCreator;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataPersistService;
@@ -114,15 +115,15 @@ public final class MetaDataPersistService implements 
MetaDataBasedPersistService
     
     private Map<String, DataSourceProperties> getDataSourcePropertiesMap(final 
DatabaseConfiguration databaseConfigs) {
         if (!databaseConfigs.getDataSources().isEmpty() && 
databaseConfigs.getDataSourcePropsMap().isEmpty()) {
-            return 
getDataSourcePropertiesMap(databaseConfigs.getStorageResource().getStorageNodes());
+            return 
getDataSourcePropertiesMap(databaseConfigs.getStorageResource().getStorageNodeDataSources());
         }
         return databaseConfigs.getDataSourcePropsMap();
     }
     
-    private Map<String, DataSourceProperties> getDataSourcePropertiesMap(final 
Map<String, DataSource> dataSourceMap) {
-        Map<String, DataSourceProperties> result = new 
LinkedHashMap<>(dataSourceMap.size(), 1F);
-        for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
-            result.put(entry.getKey(), 
DataSourcePropertiesCreator.create(entry.getValue()));
+    private Map<String, DataSourceProperties> getDataSourcePropertiesMap(final 
Map<StorageNode, DataSource> storageNodeDataSources) {
+        Map<String, DataSourceProperties> result = new 
LinkedHashMap<>(storageNodeDataSources.size(), 1F);
+        for (Entry<StorageNode, DataSource> entry : 
storageNodeDataSources.entrySet()) {
+            result.put(entry.getKey().getName(), 
DataSourcePropertiesCreator.create(entry.getValue()));
         }
         return result;
     }
@@ -131,7 +132,7 @@ public final class MetaDataPersistService implements 
MetaDataBasedPersistService
     public Map<String, DataSourceConfiguration> getEffectiveDataSources(final 
String databaseName, final Map<String, ? extends DatabaseConfiguration> 
databaseConfigs) {
         Map<String, DataSourceProperties> persistedDataPropsMap = 
dataSourceUnitService.load(databaseName);
         if (databaseConfigs.containsKey(databaseName) && 
!databaseConfigs.get(databaseName).getDataSources().isEmpty()) {
-            
databaseConfigs.get(databaseName).getStorageResource().getStorageNodes().values().forEach(each
 -> new DataSourcePoolDestroyer(each).asyncDestroy());
+            
databaseConfigs.get(databaseName).getStorageResource().getStorageNodeDataSources().values().forEach(each
 -> new DataSourcePoolDestroyer(each).asyncDestroy());
         }
         return 
persistedDataPropsMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey,
                 entry -> 
DataSourcePropertiesCreator.createConfiguration(entry.getValue()), (key, value) 
-> value, LinkedHashMap::new));
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
index 2e4020a6dc8..58183642946 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfigur
 import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourcePropertiesCreator;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataPersistService;
@@ -121,15 +122,15 @@ public final class NewMetaDataPersistService implements 
MetaDataBasedPersistServ
     
     private Map<String, DataSourceProperties> getDataSourcePropertiesMap(final 
DatabaseConfiguration databaseConfigs) {
         if (!databaseConfigs.getDataSources().isEmpty() && 
databaseConfigs.getDataSourcePropsMap().isEmpty()) {
-            return 
getDataSourcePropertiesMap(databaseConfigs.getStorageResource().getStorageNodes());
+            return 
getDataSourcePropertiesMap(databaseConfigs.getStorageResource().getStorageNodeDataSources());
         }
         return databaseConfigs.getDataSourcePropsMap();
     }
     
-    private Map<String, DataSourceProperties> getDataSourcePropertiesMap(final 
Map<String, DataSource> dataSourceMap) {
-        Map<String, DataSourceProperties> result = new 
LinkedHashMap<>(dataSourceMap.size(), 1F);
-        for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
-            result.put(entry.getKey(), 
DataSourcePropertiesCreator.create(entry.getValue()));
+    private Map<String, DataSourceProperties> getDataSourcePropertiesMap(final 
Map<StorageNode, DataSource> storageNodeDataSources) {
+        Map<String, DataSourceProperties> result = new 
LinkedHashMap<>(storageNodeDataSources.size(), 1F);
+        for (Entry<StorageNode, DataSource> entry : 
storageNodeDataSources.entrySet()) {
+            result.put(entry.getKey().getName(), 
DataSourcePropertiesCreator.create(entry.getValue()));
         }
         return result;
     }
@@ -145,7 +146,7 @@ public final class NewMetaDataPersistService implements 
MetaDataBasedPersistServ
     public Map<String, DataSourceConfiguration> getEffectiveDataSources(final 
String databaseName, final Map<String, ? extends DatabaseConfiguration> 
databaseConfigs) {
         Map<String, DataSourceProperties> persistedDataPropsMap = 
dataSourceUnitService.load(databaseName);
         if (databaseConfigs.containsKey(databaseName) && 
!databaseConfigs.get(databaseName).getDataSources().isEmpty()) {
-            
databaseConfigs.get(databaseName).getStorageResource().getStorageNodes().values().forEach(each
 -> new DataSourcePoolDestroyer(each).asyncDestroy());
+            
databaseConfigs.get(databaseName).getStorageResource().getStorageNodeDataSources().values().forEach(each
 -> new DataSourcePoolDestroyer(each).asyncDestroy());
         }
         return 
persistedDataPropsMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey,
                 entry -> 
DataSourcePropertiesCreator.createConfiguration(entry.getValue()), (key, value) 
-> value, LinkedHashMap::new));
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 04fea6bc451..588cac79f8c 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
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.datasource.storage.StorageResource;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageUnitNodeMapper;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
@@ -269,7 +270,7 @@ public final class ConfigurationContextManager {
      * @return ShardingSphere databases
      */
     public Map<String, ShardingSphereDatabase> renewDatabase(final 
ShardingSphereDatabase database, final SwitchingResource resource) {
-        Map<String, DataSource> newStorageNodes = 
getNewStorageNodes(database.getResourceMetaData().getStorageNodeMetaData().getDataSources(),
 resource);
+        Map<StorageNode, DataSource> newStorageNodes = 
getNewStorageNodes(database.getResourceMetaData().getStorageNodeDataSources(), 
resource);
         Map<String, StorageUnitNodeMapper> newStorageUnitNodeMappers = 
getNewStorageUnitNodeMappers(database.getResourceMetaData().getStorageUnitMetaData().getUnitNodeMappers(),
 resource);
         StorageResource newStorageResource = new 
StorageResource(newStorageNodes, newStorageUnitNodeMappers);
         return Collections.singletonMap(database.getName().toLowerCase(),
@@ -278,10 +279,10 @@ public final class ConfigurationContextManager {
                         database.getRuleMetaData(), database.getSchemas()));
     }
     
-    private Map<String, DataSource> getNewStorageNodes(final Map<String, 
DataSource> currentStorageNodes, final SwitchingResource resource) {
-        Map<String, DataSource> result = new LinkedHashMap<>();
-        for (Entry<String, DataSource> entry : currentStorageNodes.entrySet()) 
{
-            if 
(!resource.getStaleStorageResource().getStorageNodes().containsKey(entry.getKey()))
 {
+    private Map<StorageNode, DataSource> getNewStorageNodes(final 
Map<StorageNode, DataSource> currentStorageNodes, final SwitchingResource 
resource) {
+        Map<StorageNode, DataSource> result = new LinkedHashMap<>();
+        for (Entry<StorageNode, DataSource> entry : 
currentStorageNodes.entrySet()) {
+            if 
(!resource.getStaleStorageResource().getStorageNodeDataSources().containsKey(entry.getKey()))
 {
                 result.put(entry.getKey(), entry.getValue());
             }
         }
@@ -338,8 +339,8 @@ public final class ConfigurationContextManager {
     public synchronized Map<String, ShardingSphereDatabase> 
createChangedDatabases(final String databaseName, final boolean 
internalLoadMetaData,
                                                                                
    final SwitchingResource switchingResource, final 
Collection<RuleConfiguration> ruleConfigs) throws SQLException {
         ResourceMetaData resourceMetaData = 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData();
-        if (null != switchingResource && null != 
switchingResource.getNewStorageResource() && 
!switchingResource.getNewStorageResource().getStorageNodes().isEmpty()) {
-            
resourceMetaData.getStorageNodeMetaData().getDataSources().putAll(switchingResource.getNewStorageResource().getStorageNodes());
+        if (null != switchingResource && null != 
switchingResource.getNewStorageResource() && 
!switchingResource.getNewStorageResource().getStorageNodeDataSources().isEmpty())
 {
+            
resourceMetaData.getStorageNodeDataSources().putAll(switchingResource.getNewStorageResource().getStorageNodeDataSources());
         }
         if (null != switchingResource && null != 
switchingResource.getNewStorageResource() && 
!switchingResource.getNewStorageResource().getStorageUnitNodeMappers().isEmpty())
 {
             
resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers().putAll(switchingResource.getNewStorageResource().getStorageUnitNodeMappers());
@@ -347,7 +348,7 @@ public final class ConfigurationContextManager {
         Collection<RuleConfiguration> toBeCreatedRuleConfigs = null == 
ruleConfigs
                 ? 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations()
                 : ruleConfigs;
-        StorageResource storageResource = new 
StorageResource(resourceMetaData.getStorageNodeMetaData().getDataSources(), 
resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers());
+        StorageResource storageResource = new 
StorageResource(resourceMetaData.getStorageNodeDataSources(), 
resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers());
         DatabaseConfiguration toBeCreatedDatabaseConfig = new 
DataSourceProvidedDatabaseConfiguration(
                 storageResource, toBeCreatedRuleConfigs, 
resourceMetaData.getStorageUnitMetaData().getDataSourcePropsMap());
         ShardingSphereDatabase changedDatabase = 
createChangedDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
 internalLoadMetaData,
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
index 871afefa696..ee2fd671c84 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.mode.manager.switcher;
 
 import 
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.datasource.storage.StorageResource;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageResourceWithProperties;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageUnitNodeMapper;
@@ -51,10 +52,10 @@ public final class NewResourceSwitchManager {
     }
     
     private StorageResource getRegisterNewStorageResource(final 
ResourceMetaData resourceMetaData, final StorageResourceWithProperties 
toBeCreatedStorageResource) {
-        Map<String, DataSource> storageNodes = new 
LinkedHashMap<>(toBeCreatedStorageResource.getStorageNodes().size(), 1F);
-        for (String each : 
toBeCreatedStorageResource.getStorageNodes().keySet()) {
-            if 
(!resourceMetaData.getStorageNodeMetaData().getDataSources().containsKey(each)) 
{
-                storageNodes.put(each, 
DataSourcePoolCreator.create(toBeCreatedStorageResource.getDataSourcePropertiesMap().get(each)));
+        Map<StorageNode, DataSource> storageNodes = new 
LinkedHashMap<>(toBeCreatedStorageResource.getStorageNodeDataSources().size(), 
1F);
+        for (StorageNode each : 
toBeCreatedStorageResource.getStorageNodeDataSources().keySet()) {
+            if 
(!resourceMetaData.getStorageNodeDataSources().containsKey(each)) {
+                storageNodes.put(each, 
DataSourcePoolCreator.create(toBeCreatedStorageResource.getDataSourcePropertiesMap().get(each.getName())));
             }
         }
         return new StorageResource(storageNodes, 
toBeCreatedStorageResource.getStorageUnitNodeMappers());
@@ -75,17 +76,17 @@ public final class NewResourceSwitchManager {
     }
     
     private StorageResource getAlterNewStorageResource(final 
StorageResourceWithProperties toBeAlteredStorageResource) {
-        Map<String, DataSource> storageNodes = new 
LinkedHashMap<>(toBeAlteredStorageResource.getStorageNodes().size(), 1F);
-        for (String each : 
toBeAlteredStorageResource.getStorageNodes().keySet()) {
-            storageNodes.put(each, 
DataSourcePoolCreator.create(toBeAlteredStorageResource.getDataSourcePropertiesMap().get(each)));
+        Map<StorageNode, DataSource> storageNodes = new 
LinkedHashMap<>(toBeAlteredStorageResource.getStorageNodeDataSources().size(), 
1F);
+        for (StorageNode each : 
toBeAlteredStorageResource.getStorageNodeDataSources().keySet()) {
+            storageNodes.put(each, 
DataSourcePoolCreator.create(toBeAlteredStorageResource.getDataSourcePropertiesMap().get(each.getName())));
         }
         return new StorageResource(storageNodes, 
toBeAlteredStorageResource.getStorageUnitNodeMappers());
     }
     
     private StorageResource getStaleStorageResource(final ResourceMetaData 
resourceMetaData, final StorageResourceWithProperties 
toBeAlteredStorageResource) {
-        Map<String, DataSource> storageNodes = new 
LinkedHashMap<>(toBeAlteredStorageResource.getStorageNodes().size(), 1F);
-        for (Entry<String, DataSource> entry : 
resourceMetaData.getStorageNodeMetaData().getDataSources().entrySet()) {
-            if 
(toBeAlteredStorageResource.getStorageNodes().containsKey(entry.getKey())) {
+        Map<StorageNode, DataSource> storageNodes = new 
LinkedHashMap<>(toBeAlteredStorageResource.getStorageNodeDataSources().size(), 
1F);
+        for (Entry<StorageNode, DataSource> entry : 
resourceMetaData.getStorageNodeDataSources().entrySet()) {
+            if 
(toBeAlteredStorageResource.getStorageNodeDataSources().containsKey(entry.getKey()))
 {
                 storageNodes.put(entry.getKey(), entry.getValue());
             }
         }
@@ -108,9 +109,9 @@ public final class NewResourceSwitchManager {
     private StorageResource getToBeRemovedStaleStorageResource(final 
ResourceMetaData resourceMetaData, final String storageUnitName) {
         StorageUnitNodeMapper storageUnitNodeMapper = 
resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers().remove(storageUnitName);
         Map<String, StorageUnitNodeMapper> reservedStorageUnitNodeMappers = 
resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers();
-        Map<String, DataSource> storageNodes = new LinkedHashMap<>(1, 1F);
-        if (reservedStorageUnitNodeMappers.values().stream().noneMatch(each -> 
each.getNodeName().equals(storageUnitNodeMapper.getNodeName()))) {
-            storageNodes.put(storageUnitNodeMapper.getNodeName(), 
resourceMetaData.getStorageNodeMetaData().getDataSources().get(storageUnitNodeMapper.getNodeName()));
+        Map<StorageNode, DataSource> storageNodes = new LinkedHashMap<>(1, 1F);
+        if (reservedStorageUnitNodeMappers.values().stream().noneMatch(each -> 
each.getStorageNode().equals(storageUnitNodeMapper.getStorageNode()))) {
+            storageNodes.put(storageUnitNodeMapper.getStorageNode(), 
resourceMetaData.getStorageNodeDataSources().get(storageUnitNodeMapper.getStorageNode()));
         }
         return new StorageResource(storageNodes, 
Collections.singletonMap(storageUnitName, storageUnitNodeMapper));
     }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
index caba3d2e413..076a4b79b8e 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.mode.manager.switcher;
 import 
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourcePropertiesCreator;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.datasource.storage.StorageResource;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageResourceWithProperties;
 import 
org.apache.shardingsphere.infra.datasource.storage.StorageUnitNodeMapper;
@@ -83,24 +84,26 @@ public final class ResourceSwitchManager {
         
resourceMetaData.getStorageUnitMetaData().getDataSourcePropsMap().putAll(toBeChangedDataSourceProps);
         StorageResourceWithProperties toBeChangedStorageResource = 
DataSourcePoolCreator.createStorageResourceWithoutDataSource(toBeChangedDataSourceProps);
         StorageResource staleStorageResource = 
getStaleDataSources(resourceMetaData, toBeChangedStorageResource);
-        
staleStorageResource.getStorageNodes().putAll(getToBeDeletedDataSources(resourceMetaData.getStorageNodeMetaData().getDataSources(),
 toBeChangedStorageResource.getStorageNodes().keySet()));
+        staleStorageResource.getStorageNodeDataSources()
+                
.putAll(getToBeDeletedDataSources(resourceMetaData.getStorageNodeDataSources(), 
toBeChangedStorageResource.getStorageNodeDataSources().keySet()));
         staleStorageResource.getStorageUnitNodeMappers().putAll(
                 
getToBeDeletedStorageUnitNodeMappers(resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers(),
 toBeChangedStorageResource.getStorageUnitNodeMappers().keySet()));
         return new SwitchingResource(resourceMetaData, 
createNewStorageResource(resourceMetaData, toBeChangedStorageResource), 
staleStorageResource, toBeChangedDataSourceProps);
     }
     
     private StorageResource createNewStorageResource(final ResourceMetaData 
resourceMetaData, final StorageResourceWithProperties 
toBeChangedStorageResource) {
-        Map<String, DataSource> storageNodes = 
getNewStorageNodes(resourceMetaData, 
toBeChangedStorageResource.getStorageNodes(), 
toBeChangedStorageResource.getDataSourcePropertiesMap());
+        Map<StorageNode, DataSource> storageNodes =
+                getNewStorageNodes(resourceMetaData, 
toBeChangedStorageResource.getStorageNodeDataSources(), 
toBeChangedStorageResource.getDataSourcePropertiesMap());
         Map<String, StorageUnitNodeMapper> storageUnitNodeMappers = 
getNewStorageUnitNodeMappers(resourceMetaData, 
toBeChangedStorageResource.getStorageUnitNodeMappers());
         return new StorageResource(storageNodes, storageUnitNodeMappers);
     }
     
-    private Map<String, DataSource> getNewStorageNodes(final ResourceMetaData 
resourceMetaData, final Map<String, DataSource> toBeChangedStorageNodes,
-                                                       final Map<String, 
DataSourceProperties> dataSourcePropertiesMap) {
-        Map<String, DataSource> result = new 
LinkedHashMap<>(resourceMetaData.getStorageNodeMetaData().getDataSources());
-        
result.keySet().removeAll(getToBeDeletedDataSources(resourceMetaData.getStorageNodeMetaData().getDataSources(),
 toBeChangedStorageNodes.keySet()).keySet());
-        
result.putAll(getChangedDataSources(resourceMetaData.getStorageNodeMetaData().getDataSources(),
 toBeChangedStorageNodes, dataSourcePropertiesMap));
-        
result.putAll(getToBeAddedDataSources(resourceMetaData.getStorageNodeMetaData().getDataSources(),
 toBeChangedStorageNodes, dataSourcePropertiesMap));
+    private Map<StorageNode, DataSource> getNewStorageNodes(final 
ResourceMetaData resourceMetaData, final Map<StorageNode, DataSource> 
toBeChangedStorageNodes,
+                                                            final Map<String, 
DataSourceProperties> dataSourcePropertiesMap) {
+        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(resourceMetaData.getStorageNodeDataSources());
+        
result.keySet().removeAll(getToBeDeletedDataSources(resourceMetaData.getStorageNodeDataSources(),
 toBeChangedStorageNodes.keySet()).keySet());
+        
result.putAll(getChangedDataSources(resourceMetaData.getStorageNodeDataSources(),
 toBeChangedStorageNodes, dataSourcePropertiesMap));
+        
result.putAll(getToBeAddedDataSources(resourceMetaData.getStorageNodeDataSources(),
 toBeChangedStorageNodes, dataSourcePropertiesMap));
         return result;
     }
     
@@ -112,27 +115,27 @@ public final class ResourceSwitchManager {
         return result;
     }
     
-    private Map<String, DataSource> getChangedDataSources(final Map<String, 
DataSource> storageNodes, final Map<String, DataSource> toBeChangedStorageNodes,
-                                                          final Map<String, 
DataSourceProperties> dataSourcePropertiesMap) {
-        Collection<String> toBeChangedDataSourceNames = 
toBeChangedStorageNodes.keySet().stream()
-                .filter(each -> isModifiedDataSource(storageNodes, each, 
dataSourcePropertiesMap.get(each))).collect(Collectors.toList());
-        Map<String, DataSource> result = new 
LinkedHashMap<>(toBeChangedStorageNodes.size(), 1F);
-        for (String each : toBeChangedDataSourceNames) {
-            result.put(each, 
DataSourcePoolCreator.create(dataSourcePropertiesMap.get(each)));
+    private Map<StorageNode, DataSource> getChangedDataSources(final 
Map<StorageNode, DataSource> storageNodes, final Map<StorageNode, DataSource> 
toBeChangedStorageNodes,
+                                                               final 
Map<String, DataSourceProperties> dataSourcePropertiesMap) {
+        Collection<StorageNode> toBeChangedDataSourceNames = 
toBeChangedStorageNodes.keySet().stream()
+                .filter(each -> isModifiedDataSource(storageNodes, each, 
dataSourcePropertiesMap.get(each.getName()))).collect(Collectors.toList());
+        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(toBeChangedStorageNodes.size(), 1F);
+        for (StorageNode each : toBeChangedDataSourceNames) {
+            result.put(each, 
DataSourcePoolCreator.create(dataSourcePropertiesMap.get(each.getName())));
         }
         return result;
     }
     
-    private boolean isModifiedDataSource(final Map<String, DataSource> 
originalDataSources, final String dataSourceName, final DataSourceProperties 
dataSourceProps) {
-        return originalDataSources.containsKey(dataSourceName) && 
!dataSourceProps.equals(DataSourcePropertiesCreator.create(originalDataSources.get(dataSourceName)));
+    private boolean isModifiedDataSource(final Map<StorageNode, DataSource> 
originalDataSources, final StorageNode storageNode, final DataSourceProperties 
dataSourceProps) {
+        return originalDataSources.containsKey(storageNode) && 
!dataSourceProps.equals(DataSourcePropertiesCreator.create(originalDataSources.get(storageNode)));
     }
     
-    private Map<String, DataSource> getToBeAddedDataSources(final Map<String, 
DataSource> storageNodes, final Map<String, DataSource> toBeChangedStorageNodes,
-                                                            final Map<String, 
DataSourceProperties> dataSourcePropertiesMap) {
-        Collection<String> toBeAddedDataSourceNames = 
toBeChangedStorageNodes.keySet().stream().filter(each -> 
!storageNodes.containsKey(each)).collect(Collectors.toList());
-        Map<String, DataSource> result = new LinkedHashMap<>();
-        for (String each : toBeAddedDataSourceNames) {
-            result.put(each, 
DataSourcePoolCreator.create(dataSourcePropertiesMap.get(each)));
+    private Map<StorageNode, DataSource> getToBeAddedDataSources(final 
Map<StorageNode, DataSource> storageNodes, final Map<StorageNode, DataSource> 
toBeChangedStorageNodes,
+                                                                 final 
Map<String, DataSourceProperties> dataSourcePropertiesMap) {
+        Collection<StorageNode> toBeAddedDataSourceNames = 
toBeChangedStorageNodes.keySet().stream().filter(each -> 
!storageNodes.containsKey(each)).collect(Collectors.toList());
+        Map<StorageNode, DataSource> result = new LinkedHashMap<>();
+        for (StorageNode each : toBeAddedDataSourceNames) {
+            result.put(each, 
DataSourcePoolCreator.create(dataSourcePropertiesMap.get(each.getName())));
         }
         return result;
     }
@@ -140,9 +143,9 @@ public final class ResourceSwitchManager {
     private StorageResource getToBeRemovedStaleDataSources(final 
ResourceMetaData resourceMetaData, final StorageResourceWithProperties 
toBeRemovedStorageResource) {
         Map<String, StorageUnitNodeMapper> reservedStorageUnitNodeMappers = 
resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers().entrySet().stream()
                 .filter(entry -> 
!toBeRemovedStorageResource.getStorageUnitNodeMappers().containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
-        Collection<String> inUsedDataSourceNames = 
reservedStorageUnitNodeMappers.values().stream().map(StorageUnitNodeMapper::getNodeName).collect(Collectors.toSet());
-        Map<String, DataSource> staleStorageNodes = 
resourceMetaData.getStorageNodeMetaData().getDataSources().entrySet().stream()
-                .filter(entry -> 
toBeRemovedStorageResource.getStorageNodes().containsKey(entry.getKey()) && 
!inUsedDataSourceNames.contains(entry.getKey()))
+        Collection<StorageNode> inUsedDataSourceNames = 
reservedStorageUnitNodeMappers.values().stream().map(StorageUnitNodeMapper::getStorageNode).collect(Collectors.toSet());
+        Map<StorageNode, DataSource> staleStorageNodes = 
resourceMetaData.getStorageNodeDataSources().entrySet().stream()
+                .filter(entry -> 
toBeRemovedStorageResource.getStorageNodeDataSources().containsKey(entry.getKey())
 && !inUsedDataSourceNames.contains(entry.getKey()))
                 .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
         Map<String, StorageUnitNodeMapper> staleStorageUnitNodeMappers = 
resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers().entrySet().stream()
                 .filter(entry -> 
!reservedStorageUnitNodeMappers.containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
@@ -150,26 +153,27 @@ public final class ResourceSwitchManager {
     }
     
     private StorageResource getStaleDataSources(final ResourceMetaData 
resourceMetaData, final StorageResourceWithProperties 
toBeChangedStorageResource) {
-        Map<String, DataSource> storageNodes = new 
LinkedHashMap<>(resourceMetaData.getStorageNodeMetaData().getDataSources().size(),
 1F);
+        Map<StorageNode, DataSource> storageNodes = new 
LinkedHashMap<>(resourceMetaData.getStorageNodeDataSources().size(), 1F);
         Map<String, StorageUnitNodeMapper> storageUnitNodeMappers = new 
LinkedHashMap<>(resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers().size(),
 1F);
-        
storageNodes.putAll(getToBeChangedDataSources(resourceMetaData.getStorageNodeMetaData().getDataSources(),
 toBeChangedStorageResource.getDataSourcePropertiesMap()));
+        
storageNodes.putAll(getToBeChangedDataSources(resourceMetaData.getStorageNodeDataSources(),
 toBeChangedStorageResource.getDataSourcePropertiesMap()));
         
storageUnitNodeMappers.putAll(getChangedStorageUnitNodeMappers(resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers(),
 toBeChangedStorageResource.getStorageUnitNodeMappers()));
         return new StorageResource(storageNodes, storageUnitNodeMappers);
     }
     
-    private Map<String, DataSource> getToBeChangedDataSources(final 
Map<String, DataSource> storageNodes, final Map<String, DataSourceProperties> 
dataSourcePropertiesMap) {
-        Map<String, DataSource> result = new 
LinkedHashMap<>(storageNodes.size(), 1F);
+    private Map<StorageNode, DataSource> getToBeChangedDataSources(final 
Map<StorageNode, DataSource> storageNodes, final Map<String, 
DataSourceProperties> dataSourcePropertiesMap) {
+        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(storageNodes.size(), 1F);
         for (Entry<String, DataSourceProperties> entry : 
dataSourcePropertiesMap.entrySet()) {
-            if (isModifiedDataSource(storageNodes, entry.getKey(), 
entry.getValue())) {
-                result.put(entry.getKey(), storageNodes.get(entry.getKey()));
+            StorageNode storageNode = new StorageNode(entry.getKey());
+            if (isModifiedDataSource(storageNodes, storageNode, 
entry.getValue())) {
+                result.put(storageNode, storageNodes.get(storageNode));
             }
         }
         return result;
     }
     
-    private Map<String, DataSource> getToBeDeletedDataSources(final 
Map<String, DataSource> storageNodes, final Collection<String> 
toBeChangedDataSourceNames) {
-        Map<String, DataSource> result = new 
LinkedHashMap<>(storageNodes.size(), 1F);
-        for (Entry<String, DataSource> entry : storageNodes.entrySet()) {
+    private Map<StorageNode, DataSource> getToBeDeletedDataSources(final 
Map<StorageNode, DataSource> storageNodes, final Collection<StorageNode> 
toBeChangedDataSourceNames) {
+        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(storageNodes.size(), 1F);
+        for (Entry<StorageNode, DataSource> entry : storageNodes.entrySet()) {
             if (!toBeChangedDataSourceNames.contains(entry.getKey())) {
                 result.put(entry.getKey(), entry.getValue());
             }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResource.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResource.java
index c17aa5ed5bb..6be8230a314 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResource.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResource.java
@@ -47,6 +47,6 @@ public final class SwitchingResource {
      * Close stale data sources.
      */
     public void closeStaleDataSources() {
-        
staleStorageResource.getStorageNodes().values().stream().filter(Objects::nonNull).forEach(resourceMetaData::close);
+        
staleStorageResource.getStorageNodeDataSources().values().stream().filter(Objects::nonNull).forEach(resourceMetaData::close);
     }
 }
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 37f55859eb1..af5dca51d1f 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
@@ -24,7 +24,8 @@ import 
org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
-import org.apache.shardingsphere.infra.datasource.storage.StorageUtils;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
+import org.apache.shardingsphere.infra.datasource.storage.StorageResourceUtils;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.instance.mode.ModeContextManager;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -214,8 +215,8 @@ class ContextManagerTest {
     void assertAlterRuleConfiguration() {
         ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         Map<String, DataSource> dataSources = Collections.singletonMap("ds_0", 
new MockedDataSource());
-        
when(resourceMetaData.getStorageNodeMetaData().getDataSources()).thenReturn(dataSources);
-        
when(resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers()).thenReturn(StorageUtils.getStorageUnitNodeMappers(dataSources));
+        
when(resourceMetaData.getStorageNodeDataSources()).thenReturn(StorageResourceUtils.getStorageNodeDataSources(dataSources));
+        
when(resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers()).thenReturn(StorageResourceUtils.getStorageUnitNodeMappers(dataSources));
         ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
                 TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), 
resourceMetaData, mock(RuleMetaData.class), Collections.emptyMap());
         
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database);
@@ -235,7 +236,7 @@ class ContextManagerTest {
                 Collections.singletonMap("foo_ds", new 
DataSourceProperties(MockedDataSource.class.getName(), createProperties("test", 
"test"))));
         
assertThat(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getDataSources().size(),
 is(3));
         assertAlteredDataSource((MockedDataSource) 
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")
-                
.getResourceMetaData().getStorageNodeMetaData().getDataSources().get("foo_ds"));
+                .getResourceMetaData().getStorageNodeDataSources().get(new 
StorageNode("foo_ds")));
     }
     
     private ResourceMetaData createOriginalResource() {
@@ -244,8 +245,8 @@ class ContextManagerTest {
         originalDataSources.put("ds_1", new MockedDataSource());
         originalDataSources.put("ds_2", new MockedDataSource());
         when(result.getDataSources()).thenReturn(originalDataSources);
-        
when(result.getStorageNodeMetaData().getDataSources()).thenReturn(originalDataSources);
-        
when(result.getStorageUnitMetaData().getUnitNodeMappers()).thenReturn(StorageUtils.getStorageUnitNodeMappers(originalDataSources));
+        
when(result.getStorageNodeDataSources()).thenReturn(StorageResourceUtils.getStorageNodeDataSources(originalDataSources));
+        
when(result.getStorageUnitMetaData().getUnitNodeMappers()).thenReturn(StorageResourceUtils.getStorageUnitNodeMappers(originalDataSources));
         return result;
     }
     
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManagerTest.java
index 9b727c951a0..30431edb774 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManagerTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.mode.manager.switcher;
 
 import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.awaitility.Awaitility;
@@ -52,8 +53,8 @@ class ResourceSwitchManagerTest {
         dataSourceMap.put("ds_0", new MockedDataSource());
         dataSourceMap.put("ds_1", new MockedDataSource());
         SwitchingResource actual = new 
ResourceSwitchManager().createByAlterDataSourceProps(new 
ResourceMetaData("sharding_db", dataSourceMap), Collections.emptyMap());
-        assertTrue(actual.getNewStorageResource().getStorageNodes().isEmpty());
-        assertThat(actual.getStaleStorageResource().getStorageNodes().size(), 
is(2));
+        
assertTrue(actual.getNewStorageResource().getStorageNodeDataSources().isEmpty());
+        
assertThat(actual.getStaleStorageResource().getStorageNodeDataSources().size(), 
is(2));
         actual.closeStaleDataSources();
         assertStaleDataSource((MockedDataSource) dataSourceMap.get("ds_0"));
         assertStaleDataSource((MockedDataSource) dataSourceMap.get("ds_1"));
@@ -84,10 +85,10 @@ class ResourceSwitchManagerTest {
     }
     
     private void assertNewDataSources(final SwitchingResource actual) {
-        assertThat(actual.getNewStorageResource().getStorageNodes().size(), 
is(3));
-        
assertTrue(actual.getNewStorageResource().getStorageNodes().containsKey("not_change"));
-        
assertTrue(actual.getNewStorageResource().getStorageNodes().containsKey("new"));
-        
assertTrue(actual.getNewStorageResource().getStorageNodes().containsKey("replace"));
+        
assertThat(actual.getNewStorageResource().getStorageNodeDataSources().size(), 
is(3));
+        
assertTrue(actual.getNewStorageResource().getStorageNodeDataSources().containsKey(new
 StorageNode("not_change")));
+        
assertTrue(actual.getNewStorageResource().getStorageNodeDataSources().containsKey(new
 StorageNode("new")));
+        
assertTrue(actual.getNewStorageResource().getStorageNodeDataSources().containsKey(new
 StorageNode("replace")));
     }
     
     private void assertStaleDataSources(final Map<String, DataSource> 
originalDataSourceMap) {
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResourceTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResourceTest.java
index 6cc4f6f1b50..bfd163b17fb 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResourceTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/switcher/SwitchingResourceTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.mode.manager.switcher;
 
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.infra.datasource.storage.StorageResource;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
@@ -33,8 +34,8 @@ class SwitchingResourceTest {
     void assertCloseStaleDataSources() {
         MockedDataSource staleDataSource = new MockedDataSource();
         ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
-        StorageResource newStorageResource = new 
StorageResource(Collections.singletonMap("new_ds", new MockedDataSource()), 
Collections.emptyMap());
-        StorageResource staleStorageResource = new 
StorageResource(Collections.singletonMap("stale_ds", staleDataSource), 
Collections.emptyMap());
+        StorageResource newStorageResource = new 
StorageResource(Collections.singletonMap(new StorageNode("new_ds"), new 
MockedDataSource()), Collections.emptyMap());
+        StorageResource staleStorageResource = new 
StorageResource(Collections.singletonMap(new StorageNode("stale_ds"), 
staleDataSource), Collections.emptyMap());
         new SwitchingResource(resourceMetaData, newStorageResource, 
staleStorageResource, Collections.emptyMap()).closeStaleDataSources();
         verify(resourceMetaData).close(staleDataSource);
     }
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 7da9bc530ec..300ea1f75d8 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
@@ -114,7 +114,7 @@ class ConfigurationChangedSubscriberTest {
         when(database.getName()).thenReturn("db");
         ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
-        
when(resourceMetaData.getStorageNodeMetaData().getDataSources()).thenReturn(Collections.emptyMap());
+        
when(resourceMetaData.getStorageNodeDataSources()).thenReturn(Collections.emptyMap());
         
when(resourceMetaData.getStorageUnitMetaData().getUnitNodeMappers()).thenReturn(Collections.emptyMap());
         
when(database.getSchemas()).thenReturn(Collections.singletonMap("foo_schema", 
new ShardingSphereSchema()));
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapperTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapperTest.java
index 7dc6539e7d2..6f133fc59a5 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapperTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapperTest.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.authority.config.AuthorityRuleConfiguration;
 import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.datasource.storage.StorageNode;
 import org.apache.shardingsphere.proxy.backend.config.ProxyConfiguration;
 import org.apache.shardingsphere.proxy.backend.config.ProxyConfigurationLoader;
 import org.apache.shardingsphere.proxy.backend.config.YamlProxyConfiguration;
@@ -55,7 +56,7 @@ class YamlProxyConfigurationSwapperTest {
     private void assertDataSources(final ProxyConfiguration proxyConfig) {
         Map<String, DatabaseConfiguration> actual = 
proxyConfig.getDatabaseConfigurations();
         assertThat(actual.size(), is(1));
-        HikariDataSource dataSource = (HikariDataSource) 
actual.get("swapper_test").getStorageResource().getStorageNodes().get("foo_db");
+        HikariDataSource dataSource = (HikariDataSource) 
actual.get("swapper_test").getStorageResource().getStorageNodeDataSources().get(new
 StorageNode("foo_db"));
         assertThat(dataSource.getJdbcUrl(), 
is("jdbc:h2:mem:foo_db;DB_CLOSE_DELAY=-1"));
         assertThat(dataSource.getUsername(), is("sa"));
         assertThat(dataSource.getPassword(), is(""));


Reply via email to