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 759076c0f50 Add ShardingSphereDatabaseFactory (#34402)
759076c0f50 is described below

commit 759076c0f50fa25b4fd80623e919974aae8e6962
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Jan 19 23:07:17 2025 +0800

    Add ShardingSphereDatabaseFactory (#34402)
    
    * Add MetaDataContextsInitFactory
    
    * Add ShardingSphereDatabaseFactory
    
    * Add ShardingSphereDatabaseFactory
---
 .../infra/metadata/ShardingSphereMetaData.java     |   3 +-
 .../metadata/database/ShardingSphereDatabase.java  |  62 -----------
 ...ase.java => ShardingSphereDatabaseFactory.java} | 117 +--------------------
 .../database/ShardingSphereDatabasesFactory.java   |   8 +-
 .../infra/metadata/ShardingSphereMetaDataTest.java |   5 +-
 .../database/ShardingSphereDatabaseTest.java       |   6 +-
 .../builder/global/GlobalRulesBuilderTest.java     |   3 +-
 .../metadata/factory/MetaDataContextsFactory.java  |  80 +++++++-------
 8 files changed, 54 insertions(+), 230 deletions(-)

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 160975a4471..28a2e965b75 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
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigura
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabaseFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.identifier.ShardingSphereIdentifier;
@@ -109,7 +110,7 @@ public final class ShardingSphereMetaData implements 
AutoCloseable {
      * @param props configuration properties
      */
     public void addDatabase(final String databaseName, final DatabaseType 
protocolType, final ConfigurationProperties props) {
-        ShardingSphereDatabase database = 
ShardingSphereDatabase.create(databaseName, protocolType, props);
+        ShardingSphereDatabase database = 
ShardingSphereDatabaseFactory.create(databaseName, protocolType, props);
         databases.put(new ShardingSphereIdentifier(database.getName()), 
database);
         globalRuleMetaData.getRules().forEach(each -> ((GlobalRule) 
each).refresh(databases.values(), GlobalRuleChangedType.DATABASE_CHANGED));
     }
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 7da9ea92999..ff1ccfe4ee7 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
@@ -19,26 +19,16 @@ package org.apache.shardingsphere.infra.metadata.database;
 
 import lombok.AccessLevel;
 import lombok.Getter;
-import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
-import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
-import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.identifier.ShardingSphereIdentifier;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
-import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 
 import javax.sql.DataSource;
-import java.sql.SQLException;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -73,58 +63,6 @@ public final class ShardingSphereDatabase {
         this.schemas = new 
ConcurrentHashMap<>(schemas.stream().collect(Collectors.toMap(each -> new 
ShardingSphereIdentifier(each.getName()), each -> each)));
     }
     
-    /**
-     * Create system database.
-     *
-     * @param name system database name
-     * @param protocolType protocol database type
-     * @param props configuration properties
-     * @return created system database
-     */
-    public static ShardingSphereDatabase create(final String name, final 
DatabaseType protocolType, final ConfigurationProperties props) {
-        DatabaseConfiguration databaseConfig = new 
DataSourceProvidedDatabaseConfiguration(new LinkedHashMap<>(), new 
LinkedList<>());
-        ResourceMetaData resourceMetaData = new 
ResourceMetaData(databaseConfig.getDataSources(), 
databaseConfig.getStorageUnits());
-        return new ShardingSphereDatabase(name, protocolType, 
resourceMetaData, new RuleMetaData(new LinkedList<>()), 
SystemSchemaBuilder.build(name, protocolType, props).values());
-    }
-    
-    /**
-     * Create database.
-     *
-     * @param name database name
-     * @param protocolType database protocol type
-     * @param databaseConfig database configuration
-     * @param props configuration properties
-     * @param computeNodeInstanceContext compute node instance context
-     * @return created database
-     * @throws SQLException SQL exception
-     */
-    public static ShardingSphereDatabase create(final String name, final 
DatabaseType protocolType, final DatabaseConfiguration databaseConfig,
-                                                final ConfigurationProperties 
props, final ComputeNodeInstanceContext computeNodeInstanceContext) throws 
SQLException {
-        ResourceMetaData resourceMetaData = new 
ResourceMetaData(databaseConfig.getDataSources(), 
databaseConfig.getStorageUnits());
-        Collection<ShardingSphereRule> databaseRules = 
DatabaseRulesBuilder.build(name, protocolType, databaseConfig, 
computeNodeInstanceContext, resourceMetaData);
-        Map<String, ShardingSphereSchema> schemas = new 
ConcurrentHashMap<>(GenericSchemaBuilder.build(protocolType,
-                new 
GenericSchemaBuilderMaterial(resourceMetaData.getStorageUnits(), databaseRules, 
props, new DatabaseTypeRegistry(protocolType).getDefaultSchemaName(name))));
-        SystemSchemaBuilder.build(name, protocolType, 
props).forEach(schemas::putIfAbsent);
-        return new ShardingSphereDatabase(name, protocolType, 
resourceMetaData, new RuleMetaData(databaseRules), schemas.values());
-    }
-    
-    /**
-     * Create database.
-     *
-     * @param name database name
-     * @param protocolType database protocol type
-     * @param databaseConfig database configuration
-     * @param computeNodeInstanceContext compute node instance context
-     * @param schemas schemas
-     * @return created database
-     */
-    public static ShardingSphereDatabase create(final String name, final 
DatabaseType protocolType, final DatabaseConfiguration databaseConfig,
-                                                final 
ComputeNodeInstanceContext computeNodeInstanceContext, final 
Collection<ShardingSphereSchema> schemas) {
-        ResourceMetaData resourceMetaData = new 
ResourceMetaData(databaseConfig.getDataSources(), 
databaseConfig.getStorageUnits());
-        Collection<ShardingSphereRule> rules = 
DatabaseRulesBuilder.build(name, protocolType, databaseConfig, 
computeNodeInstanceContext, resourceMetaData);
-        return new ShardingSphereDatabase(name, protocolType, 
resourceMetaData, new RuleMetaData(rules), schemas);
-    }
-    
     /**
      * Get all schemas.
      *
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/ShardingSphereDatabaseFactory.java
similarity index 57%
copy from 
infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
copy to 
infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseFactory.java
index 7da9ea92999..bc4d8ce1ce2 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/ShardingSphereDatabaseFactory.java
@@ -18,11 +18,10 @@
 package org.apache.shardingsphere.infra.metadata.database;
 
 import lombok.AccessLevel;
-import lombok.Getter;
+import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
@@ -32,46 +31,21 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.metadata.identifier.ShardingSphereIdentifier;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 
-import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
 
 /**
- * ShardingSphere database.
+ * ShardingSphere database factory.
  */
-@Getter
-public final class ShardingSphereDatabase {
-    
-    private final String name;
-    
-    private final DatabaseType protocolType;
-    
-    private final ResourceMetaData resourceMetaData;
-    
-    private final RuleMetaData ruleMetaData;
-    
-    @Getter(AccessLevel.NONE)
-    private final Map<ShardingSphereIdentifier, ShardingSphereSchema> schemas;
-    
-    public ShardingSphereDatabase(final String name, final DatabaseType 
protocolType, final ResourceMetaData resourceMetaData,
-                                  final RuleMetaData ruleMetaData, final 
Collection<ShardingSphereSchema> schemas) {
-        this.name = name;
-        this.protocolType = protocolType;
-        this.resourceMetaData = resourceMetaData;
-        this.ruleMetaData = ruleMetaData;
-        this.schemas = new 
ConcurrentHashMap<>(schemas.stream().collect(Collectors.toMap(each -> new 
ShardingSphereIdentifier(each.getName()), each -> each)));
-    }
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ShardingSphereDatabaseFactory {
     
     /**
      * Create system database.
@@ -124,87 +98,4 @@ public final class ShardingSphereDatabase {
         Collection<ShardingSphereRule> rules = 
DatabaseRulesBuilder.build(name, protocolType, databaseConfig, 
computeNodeInstanceContext, resourceMetaData);
         return new ShardingSphereDatabase(name, protocolType, 
resourceMetaData, new RuleMetaData(rules), schemas);
     }
-    
-    /**
-     * Get all schemas.
-     *
-     * @return all schemas
-     */
-    public Collection<ShardingSphereSchema> getAllSchemas() {
-        return schemas.values();
-    }
-    
-    /**
-     * Judge contains schema from database or not.
-     *
-     * @param schemaName schema name
-     * @return contains schema from database or not
-     */
-    public boolean containsSchema(final String schemaName) {
-        return schemas.containsKey(new ShardingSphereIdentifier(schemaName));
-    }
-    
-    /**
-     * Get schema.
-     *
-     * @param schemaName schema name
-     * @return schema
-     */
-    public ShardingSphereSchema getSchema(final String schemaName) {
-        return schemas.get(new ShardingSphereIdentifier(schemaName));
-    }
-    
-    /**
-     * Add schema.
-     *
-     * @param schema schema
-     */
-    public void addSchema(final ShardingSphereSchema schema) {
-        schemas.put(new ShardingSphereIdentifier(schema.getName()), schema);
-    }
-    
-    /**
-     * Drop schema.
-     *
-     * @param schemaName schema name
-     */
-    public void dropSchema(final String schemaName) {
-        schemas.remove(new ShardingSphereIdentifier(schemaName));
-    }
-    
-    /**
-     * Judge whether is completed.
-     *
-     * @return is completed or not
-     */
-    public boolean isComplete() {
-        return !ruleMetaData.getRules().isEmpty() && 
!resourceMetaData.getStorageUnits().isEmpty();
-    }
-    
-    /**
-     * Judge whether contains data source.
-     *
-     * @return contains data source or not
-     */
-    public boolean containsDataSource() {
-        return !resourceMetaData.getStorageUnits().isEmpty();
-    }
-    
-    /**
-     * Reload rules.
-     */
-    public synchronized void reloadRules() {
-        Collection<ShardingSphereRule> toBeReloadedRules = 
ruleMetaData.getRules().stream()
-                .filter(each -> 
each.getAttributes().findAttribute(MutableDataNodeRuleAttribute.class).isPresent()).collect(Collectors.toList());
-        RuleConfiguration ruleConfig = 
toBeReloadedRules.stream().map(ShardingSphereRule::getConfiguration).findFirst().orElse(null);
-        Collection<ShardingSphereRule> rules = new 
LinkedList<>(ruleMetaData.getRules());
-        toBeReloadedRules.stream().findFirst().ifPresent(optional -> {
-            rules.removeAll(toBeReloadedRules);
-            Map<String, DataSource> dataSources = 
resourceMetaData.getStorageUnits().entrySet().stream()
-                    .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new));
-            
rules.add(optional.getAttributes().getAttribute(MutableDataNodeRuleAttribute.class).reloadRule(ruleConfig,
 name, dataSources, rules));
-        });
-        ruleMetaData.getRules().clear();
-        ruleMetaData.getRules().addAll(rules);
-    }
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabasesFactory.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabasesFactory.java
index c650951b467..46e83df134d 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabasesFactory.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabasesFactory.java
@@ -62,8 +62,8 @@ public final class ShardingSphereDatabasesFactory {
                                                  final 
Collection<ShardingSphereSchema> schemas, final ConfigurationProperties props,
                                                  final 
ComputeNodeInstanceContext computeNodeInstanceContext) {
         return databaseConfig.getStorageUnits().isEmpty()
-                ? ShardingSphereDatabase.create(databaseName, protocolType, 
props)
-                : ShardingSphereDatabase.create(databaseName, 
DatabaseTypeEngine.getProtocolType(databaseConfig, props), databaseConfig, 
computeNodeInstanceContext, schemas);
+                ? ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, props)
+                : ShardingSphereDatabaseFactory.create(databaseName, 
DatabaseTypeEngine.getProtocolType(databaseConfig, props), databaseConfig, 
computeNodeInstanceContext, schemas);
     }
     
     /**
@@ -92,7 +92,7 @@ public final class ShardingSphereDatabasesFactory {
         for (Entry<String, DatabaseConfiguration> entry : 
databaseConfigMap.entrySet()) {
             String databaseName = entry.getKey();
             if (!entry.getValue().getStorageUnits().isEmpty() || 
!systemDatabase.getSystemSchemas().contains(databaseName)) {
-                result.add(ShardingSphereDatabase.create(databaseName, 
protocolType, entry.getValue(), props, instanceContext));
+                result.add(ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, entry.getValue(), props, instanceContext));
             }
         }
         return result;
@@ -103,7 +103,7 @@ public final class ShardingSphereDatabasesFactory {
         Collection<ShardingSphereDatabase> result = new 
HashSet<>(systemDatabase.getSystemDatabaseSchemaMap().size(), 1F);
         for (String each : 
systemDatabase.getSystemDatabaseSchemaMap().keySet()) {
             if (!databaseConfigMap.containsKey(each) || 
databaseConfigMap.get(each).getStorageUnits().isEmpty()) {
-                result.add(ShardingSphereDatabase.create(each, protocolType, 
props));
+                result.add(ShardingSphereDatabaseFactory.create(each, 
protocolType, props));
             }
         }
         return result;
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 f1f4a28fbc4..98a9c8020cc 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
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabaseFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
@@ -58,7 +59,7 @@ import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.withSettings;
 
 @ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ShardingSphereDatabase.class)
+@StaticMockSettings(ShardingSphereDatabaseFactory.class)
 @MockitoSettings(strictness = Strictness.LENIENT)
 class ShardingSphereMetaDataTest {
     
@@ -68,7 +69,7 @@ class ShardingSphereMetaDataTest {
         ShardingSphereDatabase database = 
mockDatabase(mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), new 
MockedDataSource(), globalRule);
         DatabaseType databaseType = mock(DatabaseType.class);
         ConfigurationProperties configProps = new ConfigurationProperties(new 
Properties());
-        when(ShardingSphereDatabase.create("foo_db", databaseType, 
configProps)).thenReturn(database);
+        when(ShardingSphereDatabaseFactory.create("foo_db", databaseType, 
configProps)).thenReturn(database);
         Collection<ShardingSphereDatabase> databases = new 
LinkedList<>(Collections.singleton(database));
         ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases, mock(ResourceMetaData.class), new 
RuleMetaData(Collections.singleton(globalRule)), configProps);
         metaData.addDatabase("foo_db", databaseType, configProps);
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
index 03bea574939..f89d1ed6da7 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
@@ -53,7 +53,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 @ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ShardingSphereDatabase.class)
+@StaticMockSettings(ShardingSphereDatabaseFactory.class)
 @MockitoSettings(strictness = Strictness.LENIENT)
 class ShardingSphereDatabaseTest {
     
@@ -154,7 +154,7 @@ class ShardingSphereDatabaseTest {
     @Test
     void assertGetPostgreSQLDefaultSchema() throws SQLException {
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
-        ShardingSphereDatabase actual = 
ShardingSphereDatabase.create("foo_db", databaseType,
+        ShardingSphereDatabase actual = 
ShardingSphereDatabaseFactory.create("foo_db", databaseType,
                 mock(DataSourceProvidedDatabaseConfiguration.class), new 
ConfigurationProperties(new Properties()), 
mock(ComputeNodeInstanceContext.class));
         assertNotNull(actual.getSchema("public"));
     }
@@ -162,7 +162,7 @@ class ShardingSphereDatabaseTest {
     @Test
     void assertGetMySQLDefaultSchema() throws SQLException {
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "MySQL");
-        ShardingSphereDatabase actual = 
ShardingSphereDatabase.create("foo_db", databaseType,
+        ShardingSphereDatabase actual = 
ShardingSphereDatabaseFactory.create("foo_db", databaseType,
                 mock(DataSourceProvidedDatabaseConfiguration.class), new 
ConfigurationProperties(new Properties()), 
mock(ComputeNodeInstanceContext.class));
         assertNotNull(actual.getSchema("foo_db"));
     }
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
index 6dbf6f6f747..94ec9c41523 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.rule.builder.global;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabaseFactory;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.fixture.FixtureGlobalRule;
 import 
org.apache.shardingsphere.infra.rule.builder.fixture.FixtureGlobalRuleConfiguration;
@@ -51,6 +52,6 @@ class GlobalRulesBuilderTest {
     }
     
     private ShardingSphereDatabase buildDatabase() {
-        return ShardingSphereDatabase.create("foo_db", 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), new 
ConfigurationProperties(new Properties()));
+        return ShardingSphereDatabaseFactory.create("foo_db", 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), new 
ConfigurationProperties(new Properties()));
     }
 }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
index 646d595a0e9..b9eb4ed10bd 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePo
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabaseFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
@@ -82,15 +83,15 @@ public final class MetaDataContextsFactory {
      * Create meta data contexts by switch resource.
      *
      * @param databaseName database name
-     * @param internalLoadMetaData internal load meta data
+     * @param isLoadSchemasFromRegisterCenter is load schemas from register 
center or not
      * @param switchingResource switching resource
      * @param originalMetaDataContexts original meta data contexts
      * @return meta data contexts
      * @throws SQLException SQL exception
      */
-    public MetaDataContexts createBySwitchResource(final String databaseName, 
final boolean internalLoadMetaData, final SwitchingResource switchingResource,
-                                                   final MetaDataContexts 
originalMetaDataContexts) throws SQLException {
-        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, internalLoadMetaData, switchingResource, 
null, originalMetaDataContexts);
+    public MetaDataContexts createBySwitchResource(final String databaseName, 
final boolean isLoadSchemasFromRegisterCenter,
+                                                   final SwitchingResource 
switchingResource, final MetaDataContexts originalMetaDataContexts) throws 
SQLException {
+        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, isLoadSchemasFromRegisterCenter, 
switchingResource, null, originalMetaDataContexts);
         ConfigurationProperties props = 
originalMetaDataContexts.getMetaData().getProps();
         ShardingSphereMetaData clonedMetaData = 
cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase);
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
@@ -104,15 +105,15 @@ public final class MetaDataContextsFactory {
      * Create meta data contexts by alter rule.
      *
      * @param databaseName database name
-     * @param internalLoadMetaData internal load meta data
+     * @param isLoadSchemasFromRegisterCenter is load schemas from register 
center or not
      * @param ruleConfigs rule configs
      * @param originalMetaDataContexts original meta data contexts
      * @return meta data contexts
      * @throws SQLException SQL exception
      */
-    public MetaDataContexts createByAlterRule(final String databaseName, final 
boolean internalLoadMetaData, final Collection<RuleConfiguration> ruleConfigs,
-                                              final MetaDataContexts 
originalMetaDataContexts) throws SQLException {
-        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, internalLoadMetaData, null, ruleConfigs, 
originalMetaDataContexts);
+    public MetaDataContexts createByAlterRule(final String databaseName, final 
boolean isLoadSchemasFromRegisterCenter,
+                                              final 
Collection<RuleConfiguration> ruleConfigs, final MetaDataContexts 
originalMetaDataContexts) throws SQLException {
+        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, isLoadSchemasFromRegisterCenter, null, 
ruleConfigs, originalMetaDataContexts);
         ShardingSphereMetaData clonedMetaData = 
cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase);
         ConfigurationProperties props = 
originalMetaDataContexts.getMetaData().getProps();
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
@@ -130,67 +131,58 @@ public final class MetaDataContextsFactory {
     }
     
     /**
-     * Create changed database by switch resource.
+     * Create changed database.
      *
      * @param databaseName database name
-     * @param internalLoadMetaData internal load meta data
+     * @param isLoadSchemasFromRegisterCenter is load schemas from register 
center or not
      * @param switchingResource switching resource
      * @param ruleConfigs rule configurations
      * @param originalMetaDataContext original meta data contexts
      * @return changed database
      * @throws SQLException SQL exception
      */
-    public ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean internalLoadMetaData, final SwitchingResource 
switchingResource,
-                                                        final 
Collection<RuleConfiguration> ruleConfigs, final MetaDataContexts 
originalMetaDataContext) throws SQLException {
-        ResourceMetaData effectiveResourceMetaData = 
getEffectiveResourceMetaData(originalMetaDataContext.getMetaData().getDatabase(databaseName),
 switchingResource);
-        Collection<RuleConfiguration> toBeCreatedRuleConfigs = null == 
ruleConfigs
-                ? 
originalMetaDataContext.getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations()
-                : ruleConfigs;
+    public ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean isLoadSchemasFromRegisterCenter,
+                                                        final 
SwitchingResource switchingResource, final Collection<RuleConfiguration> 
ruleConfigs,
+                                                        final MetaDataContexts 
originalMetaDataContext) throws SQLException {
+        ShardingSphereDatabase database = 
originalMetaDataContext.getMetaData().getDatabase(databaseName);
+        ResourceMetaData effectiveResourceMetaData = 
getEffectiveResourceMetaData(database, switchingResource);
+        Collection<RuleConfiguration> toBeCreatedRuleConfigs = null == 
ruleConfigs ? database.getRuleMetaData().getConfigurations() : ruleConfigs;
         DatabaseConfiguration toBeCreatedDatabaseConfig = 
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource, 
toBeCreatedRuleConfigs);
-        return 
createChangedDatabase(originalMetaDataContext.getMetaData().getDatabase(databaseName).getName(),
 internalLoadMetaData,
-                toBeCreatedDatabaseConfig, 
originalMetaDataContext.getMetaData().getProps());
+        return createChangedDatabase(database.getName(), 
isLoadSchemasFromRegisterCenter, toBeCreatedDatabaseConfig, 
originalMetaDataContext.getMetaData().getProps());
     }
     
-    private ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean internalLoadMetaData, final DatabaseConfiguration 
databaseConfig,
+    private ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean isLoadSchemasFromRegisterCenter, final 
DatabaseConfiguration databaseConfig,
                                                          final 
ConfigurationProperties props) throws SQLException {
         DatabaseType protocolType = 
DatabaseTypeEngine.getProtocolType(databaseConfig, props);
-        return internalLoadMetaData
-                ? ShardingSphereDatabase.create(databaseName, protocolType, 
databaseConfig, instanceContext, 
persistService.getDatabaseMetaDataFacade().getSchema().load(databaseName))
-                : ShardingSphereDatabase.create(databaseName, protocolType, 
databaseConfig, props, instanceContext);
+        return isLoadSchemasFromRegisterCenter
+                ? ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, databaseConfig, instanceContext, 
persistService.getDatabaseMetaDataFacade().getSchema().load(databaseName))
+                : ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, databaseConfig, props, instanceContext);
     }
     
-    private ResourceMetaData getEffectiveResourceMetaData(final 
ShardingSphereDatabase database, final SwitchingResource resource) {
-        Map<StorageNode, DataSource> storageNodes = 
getStorageNodes(database.getResourceMetaData().getDataSources(), resource);
-        Map<String, StorageUnit> storageUnits = 
getStorageUnits(database.getResourceMetaData().getStorageUnits(), resource);
+    private ResourceMetaData getEffectiveResourceMetaData(final 
ShardingSphereDatabase database, final SwitchingResource switchingResource) {
+        Map<StorageNode, DataSource> storageNodes = 
getStorageNodes(database.getResourceMetaData().getDataSources(), 
switchingResource);
+        Map<String, StorageUnit> storageUnits = 
getStorageUnits(database.getResourceMetaData().getStorageUnits(), 
switchingResource);
         return new ResourceMetaData(storageNodes, storageUnits);
     }
     
-    private Map<StorageNode, DataSource> getStorageNodes(final 
Map<StorageNode, DataSource> currentStorageNodes, final SwitchingResource 
resource) {
-        Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(currentStorageNodes.size(), 1F);
-        for (Entry<StorageNode, DataSource> entry : 
currentStorageNodes.entrySet()) {
-            if (null == resource || 
!resource.getStaleDataSources().containsKey(entry.getKey())) {
-                result.put(entry.getKey(), entry.getValue());
-            }
-        }
-        return result;
+    private Map<StorageNode, DataSource> getStorageNodes(final 
Map<StorageNode, DataSource> currentStorageNodes, final SwitchingResource 
switchingResource) {
+        return currentStorageNodes.entrySet().stream()
+                .filter(entry -> null == switchingResource || 
!switchingResource.getStaleDataSources().containsKey(entry.getKey()))
+                .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, 
b) -> b, () -> new LinkedHashMap<>(currentStorageNodes.size(), 1F)));
     }
     
-    private Map<String, StorageUnit> getStorageUnits(final Map<String, 
StorageUnit> currentStorageUnits, final SwitchingResource resource) {
-        Map<String, StorageUnit> result = new 
LinkedHashMap<>(currentStorageUnits.size(), 1F);
-        for (Entry<String, StorageUnit> entry : 
currentStorageUnits.entrySet()) {
-            if (null == resource || 
!resource.getStaleStorageUnitNames().contains(entry.getKey())) {
-                result.put(entry.getKey(), entry.getValue());
-            }
-        }
-        return result;
+    private Map<String, StorageUnit> getStorageUnits(final Map<String, 
StorageUnit> currentStorageUnits, final SwitchingResource switchingResource) {
+        return currentStorageUnits.entrySet().stream()
+                .filter(entry -> null == switchingResource || 
!switchingResource.getStaleStorageUnitNames().contains(entry.getKey()))
+                .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, 
b) -> b, () -> new LinkedHashMap<>(currentStorageUnits.size(), 1F)));
     }
     
-    private DatabaseConfiguration getDatabaseConfiguration(final 
ResourceMetaData resourceMetaData,
+    private DatabaseConfiguration getDatabaseConfiguration(final 
ResourceMetaData currentResourceMetaData,
                                                            final 
SwitchingResource switchingResource, final Collection<RuleConfiguration> 
toBeCreatedRuleConfigs) {
-        Map<String, DataSourcePoolProperties> propsMap = null == 
switchingResource ? resourceMetaData.getStorageUnits().entrySet().stream()
+        Map<String, DataSourcePoolProperties> propsMap = null == 
switchingResource ? 
currentResourceMetaData.getStorageUnits().entrySet().stream()
                 .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) -> 
oldValue, LinkedHashMap::new))
                 : switchingResource.getMergedDataSourcePoolPropertiesMap();
-        return new 
DataSourceProvidedDatabaseConfiguration(getMergedStorageNodeDataSources(resourceMetaData,
 switchingResource), toBeCreatedRuleConfigs, propsMap);
+        return new 
DataSourceProvidedDatabaseConfiguration(getMergedStorageNodeDataSources(currentResourceMetaData,
 switchingResource), toBeCreatedRuleConfigs, propsMap);
     }
     
     private Map<StorageNode, DataSource> getMergedStorageNodeDataSources(final 
ResourceMetaData currentResourceMetaData, final SwitchingResource 
switchingResource) {


Reply via email to