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 1d89663060f Refactor MetaDataContextsFactory (#34396)
1d89663060f is described below

commit 1d89663060ff3fd7850521d69e9f8f4e48a11edb
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Jan 19 12:18:06 2025 +0800

    Refactor MetaDataContextsFactory (#34396)
---
 .../mode/metadata/MetaDataContextManager.java      |   4 +-
 .../mode/metadata/MetaDataContextsFactory.java     | 113 +++++++++------------
 .../manager/DatabaseRuleConfigurationManager.java  |   2 +-
 .../mode/metadata/manager/StorageUnitManager.java  |   4 +-
 .../mode/metadata/MetaDataContextsFactoryTest.java |   4 +-
 .../cluster/ClusterContextManagerBuilder.java      |   3 +-
 .../ClusterMetaDataManagerPersistService.java      |  12 +--
 .../StandaloneContextManagerBuilder.java           |   5 +-
 .../StandaloneMetaDataManagerPersistService.java   |  12 +--
 9 files changed, 72 insertions(+), 87 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
index 081c6aba5ab..38a4942e969 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
@@ -145,8 +145,8 @@ public class MetaDataContextManager {
         Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter 
= metaDataPersistService.getDataSourceUnitService().load(database.getName());
         SwitchingResource switchingResource = 
resourceSwitchManager.switchByAlterStorageUnit(database.getResourceMetaData(), 
dataSourcePoolPropsFromRegCenter);
         Collection<RuleConfiguration> ruleConfigs = 
metaDataPersistService.getDatabaseRulePersistService().load(database.getName());
-        ShardingSphereDatabase changedDatabase = MetaDataContextsFactory
-                .createChangedDatabase(database.getName(), false, 
switchingResource, ruleConfigs, metaDataContexts, metaDataPersistService, 
computeNodeInstanceContext);
+        ShardingSphereDatabase changedDatabase = new 
MetaDataContextsFactory(metaDataPersistService)
+                .createChangedDatabase(database.getName(), false, 
switchingResource, ruleConfigs, metaDataContexts, computeNodeInstanceContext);
         metaDataContexts.getMetaData().putDatabase(changedDatabase);
         ConfigurationProperties props = new 
ConfigurationProperties(metaDataPersistService.getPropsService().load());
         Collection<RuleConfiguration> globalRuleConfigs = 
metaDataPersistService.getGlobalRuleService().load();
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
index 7f804c71251..2fb10a2090e 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
@@ -17,8 +17,7 @@
 
 package org.apache.shardingsphere.mode.metadata;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceGeneratedDatabaseConfiguration;
 import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
@@ -60,59 +59,57 @@ import java.util.stream.Collectors;
 /**
  * Meta data contexts factory.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@RequiredArgsConstructor
 public final class MetaDataContextsFactory {
     
+    private final MetaDataPersistService persistService;
+    
     /**
      * Create meta data contexts.
      *
-     * @param persistService persist service
      * @param param context manager builder parameter
      * @param instanceContext compute node instance context
      * @return meta data contexts
      * @throws SQLException SQL exception
      */
-    public static MetaDataContexts create(final MetaDataPersistService 
persistService,
-                                          final ContextManagerBuilderParameter 
param, final ComputeNodeInstanceContext instanceContext) throws SQLException {
-        return isCreateByLocal(persistService) ? createByLocal(persistService, 
param, instanceContext) : createByRepository(persistService, param, 
instanceContext);
-    }
-    
-    private static boolean isCreateByLocal(final MetaDataPersistService 
persistService) {
-        return 
persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames().isEmpty();
+    public MetaDataContexts create(final ContextManagerBuilderParameter param, 
final ComputeNodeInstanceContext instanceContext) throws SQLException {
+        return containsRegisteredDatabases() ? createFromRegisterCenter(param, 
instanceContext) : createFromLocalConfiguration(param, instanceContext);
     }
     
-    private static MetaDataContexts createByLocal(final MetaDataPersistService 
persistService,
-                                                  final 
ContextManagerBuilderParameter param, final ComputeNodeInstanceContext 
instanceContext) throws SQLException {
-        ConfigurationProperties props = new 
ConfigurationProperties(param.getProps());
-        Collection<ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(param.getDatabaseConfigs(), props, 
instanceContext);
-        MetaDataContexts result = createMetaDataContexts(persistService, 
param.getGlobalRuleConfigs(), param.getGlobalDataSources(), databases, props);
-        persistDatabaseConfigurations(result, param, persistService);
-        persistMetaData(result, persistService);
-        return result;
+    private boolean containsRegisteredDatabases() {
+        return 
!persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames().isEmpty();
     }
     
-    private static MetaDataContexts createByRepository(final 
MetaDataPersistService persistService, final ContextManagerBuilderParameter 
param, final ComputeNodeInstanceContext instanceContext) {
+    private MetaDataContexts createFromRegisterCenter(final 
ContextManagerBuilderParameter param, final ComputeNodeInstanceContext 
instanceContext) {
         Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = 
createEffectiveDatabaseConfigurations(
-                getDatabaseNames(persistService, param.getDatabaseConfigs(), 
instanceContext), param.getDatabaseConfigs(), persistService);
+                getDatabaseNames(param.getDatabaseConfigs(), instanceContext), 
param.getDatabaseConfigs());
         Collection<RuleConfiguration> globalRuleConfigs = 
persistService.getGlobalRuleService().load();
         // TODO load global data sources from persist service
         Map<String, DataSource> globalDataSources = 
param.getGlobalDataSources();
         ConfigurationProperties props = new 
ConfigurationProperties(persistService.getPropsService().load());
         Collection<ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(
-                effectiveDatabaseConfigs, loadSchemas(persistService, 
effectiveDatabaseConfigs.keySet()), props, instanceContext);
-        return createMetaDataContexts(persistService, globalRuleConfigs, 
globalDataSources, databases, props);
+                effectiveDatabaseConfigs, 
loadSchemas(effectiveDatabaseConfigs.keySet()), props, instanceContext);
+        return createMetaDataContexts(globalRuleConfigs, globalDataSources, 
databases, props);
+    }
+    
+    private MetaDataContexts createFromLocalConfiguration(final 
ContextManagerBuilderParameter param, final ComputeNodeInstanceContext 
instanceContext) throws SQLException {
+        ConfigurationProperties props = new 
ConfigurationProperties(param.getProps());
+        Collection<ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(param.getDatabaseConfigs(), props, 
instanceContext);
+        MetaDataContexts result = 
createMetaDataContexts(param.getGlobalRuleConfigs(), 
param.getGlobalDataSources(), databases, props);
+        persistDatabaseConfigurations(result, param);
+        persistMetaData(result);
+        return result;
     }
     
-    private static MetaDataContexts createMetaDataContexts(final 
MetaDataPersistService persistService,
-                                                           final 
Collection<RuleConfiguration> globalRuleConfigs, final Map<String, DataSource> 
globalDataSources,
-                                                           final 
Collection<ShardingSphereDatabase> databases, final ConfigurationProperties 
props) {
+    private MetaDataContexts createMetaDataContexts(final 
Collection<RuleConfiguration> globalRuleConfigs, final Map<String, DataSource> 
globalDataSources,
+                                                    final 
Collection<ShardingSphereDatabase> databases, final ConfigurationProperties 
props) {
         Collection<ShardingSphereRule> globalRules = 
GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props);
         ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases, new ResourceMetaData(globalDataSources), new 
RuleMetaData(globalRules), props);
         ShardingSphereStatistics statistics = 
ShardingSphereStatisticsFactory.create(metaData, 
persistService.getShardingSphereDataPersistService().load(metaData));
         return new MetaDataContexts(metaData, statistics);
     }
     
-    private static void persistDatabaseConfigurations(final MetaDataContexts 
metadataContexts, final ContextManagerBuilderParameter param, final 
MetaDataPersistService persistService) {
+    private void persistDatabaseConfigurations(final MetaDataContexts 
metadataContexts, final ContextManagerBuilderParameter param) {
         Collection<RuleConfiguration> globalRuleConfigs = 
metadataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations();
         persistService.persistGlobalRuleConfiguration(globalRuleConfigs, 
param.getProps());
         for (Entry<String, ? extends DatabaseConfiguration> entry : 
param.getDatabaseConfigs().entrySet()) {
@@ -124,7 +121,7 @@ public final class MetaDataContextsFactory {
         }
     }
     
-    private static void persistMetaData(final MetaDataContexts 
metaDataContexts, final MetaDataPersistService persistService) {
+    private void persistMetaData(final MetaDataContexts metaDataContexts) {
         metaDataContexts.getMetaData().getAllDatabases().forEach(each -> 
each.getAllSchemas().forEach(schema -> {
             if (schema.isEmpty()) {
                 
persistService.getDatabaseMetaDataFacade().getSchema().add(each.getName(), 
schema.getName());
@@ -139,33 +136,30 @@ public final class MetaDataContextsFactory {
         }
     }
     
-    private static Collection<String> getDatabaseNames(final 
MetaDataPersistService persistService, final Map<String, DatabaseConfiguration> 
databaseConfigs,
-                                                       final 
ComputeNodeInstanceContext instanceContext) {
+    private Collection<String> getDatabaseNames(final Map<String, 
DatabaseConfiguration> databaseConfigs, final ComputeNodeInstanceContext 
instanceContext) {
         return instanceContext.getInstance().getMetaData() instanceof 
JDBCInstanceMetaData
                 ? databaseConfigs.keySet()
                 : 
persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames();
     }
     
-    private static Map<String, DatabaseConfiguration> 
createEffectiveDatabaseConfigurations(final Collection<String> databaseNames,
-                                                                               
             final Map<String, DatabaseConfiguration> databaseConfigs, final 
MetaDataPersistService persistService) {
-        return databaseNames.stream().collect(Collectors.toMap(each -> each, 
each -> createEffectiveDatabaseConfiguration(each, databaseConfigs, 
persistService)));
+    private Map<String, DatabaseConfiguration> 
createEffectiveDatabaseConfigurations(final Collection<String> databaseNames, 
final Map<String, DatabaseConfiguration> databaseConfigs) {
+        return databaseNames.stream().collect(Collectors.toMap(each -> each, 
each -> createEffectiveDatabaseConfiguration(each, databaseConfigs)));
     }
     
-    private static DatabaseConfiguration 
createEffectiveDatabaseConfiguration(final String databaseName,
-                                                                              
final Map<String, DatabaseConfiguration> databaseConfigs, final 
MetaDataPersistService persistService) {
+    private DatabaseConfiguration createEffectiveDatabaseConfiguration(final 
String databaseName, final Map<String, DatabaseConfiguration> databaseConfigs) {
         closeGeneratedDataSources(databaseName, databaseConfigs);
         Map<String, DataSourceConfiguration> dataSources = 
persistService.loadDataSourceConfigurations(databaseName);
         Collection<RuleConfiguration> databaseRuleConfigs = 
persistService.getDatabaseRulePersistService().load(databaseName);
         return new DataSourceGeneratedDatabaseConfiguration(dataSources, 
databaseRuleConfigs);
     }
     
-    private static void closeGeneratedDataSources(final String databaseName, 
final Map<String, ? extends DatabaseConfiguration> databaseConfigs) {
+    private void closeGeneratedDataSources(final String databaseName, final 
Map<String, ? extends DatabaseConfiguration> databaseConfigs) {
         if (databaseConfigs.containsKey(databaseName) && 
!databaseConfigs.get(databaseName).getStorageUnits().isEmpty()) {
             
databaseConfigs.get(databaseName).getDataSources().values().forEach(each -> new 
DataSourcePoolDestroyer(each).asyncDestroy());
         }
     }
     
-    private static Map<String, Collection<ShardingSphereSchema>> 
loadSchemas(final MetaDataPersistService persistService, final 
Collection<String> databaseNames) {
+    private Map<String, Collection<ShardingSphereSchema>> loadSchemas(final 
Collection<String> databaseNames) {
         return databaseNames.stream().collect(Collectors.toMap(each -> each, 
each -> persistService.getDatabaseMetaDataFacade().getSchema().load(each)));
     }
     
@@ -176,16 +170,14 @@ public final class MetaDataContextsFactory {
      * @param internalLoadMetaData internal load meta data
      * @param switchingResource switching resource
      * @param originalMetaDataContexts original meta data contexts
-     * @param persistService meta data persist service
      * @param instanceContext compute node instance context
      * @return meta data contexts
      * @throws SQLException SQL exception
      */
-    public static MetaDataContexts createBySwitchResource(final String 
databaseName, final boolean internalLoadMetaData, final SwitchingResource 
switchingResource,
-                                                          final 
MetaDataContexts originalMetaDataContexts, final MetaDataPersistService 
persistService,
-                                                          final 
ComputeNodeInstanceContext instanceContext) throws SQLException {
+    public MetaDataContexts createBySwitchResource(final String databaseName, 
final boolean internalLoadMetaData, final SwitchingResource switchingResource,
+                                                   final MetaDataContexts 
originalMetaDataContexts, final ComputeNodeInstanceContext instanceContext) 
throws SQLException {
         ShardingSphereDatabase changedDatabase = createChangedDatabase(
-                databaseName, internalLoadMetaData, switchingResource, null, 
originalMetaDataContexts, persistService, instanceContext);
+                databaseName, internalLoadMetaData, switchingResource, null, 
originalMetaDataContexts, instanceContext);
         ConfigurationProperties props = 
originalMetaDataContexts.getMetaData().getProps();
         ShardingSphereMetaData clonedMetaData = 
cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase);
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
@@ -202,16 +194,14 @@ public final class MetaDataContextsFactory {
      * @param internalLoadMetaData internal load meta data
      * @param ruleConfigs rule configs
      * @param originalMetaDataContexts original meta data contexts
-     * @param persistService meta data persist service
      * @param instanceContext compute node instance context
      * @return meta data contexts
      * @throws SQLException SQL exception
      */
-    public static MetaDataContexts createByAlterRule(final String 
databaseName, final boolean internalLoadMetaData, final 
Collection<RuleConfiguration> ruleConfigs,
-                                                     final MetaDataContexts 
originalMetaDataContexts, final MetaDataPersistService persistService,
-                                                     final 
ComputeNodeInstanceContext instanceContext) throws SQLException {
+    public MetaDataContexts createByAlterRule(final String databaseName, final 
boolean internalLoadMetaData, final Collection<RuleConfiguration> ruleConfigs,
+                                              final MetaDataContexts 
originalMetaDataContexts, final ComputeNodeInstanceContext instanceContext) 
throws SQLException {
         ShardingSphereDatabase changedDatabase = createChangedDatabase(
-                databaseName, internalLoadMetaData, null, ruleConfigs, 
originalMetaDataContexts, persistService, instanceContext);
+                databaseName, internalLoadMetaData, null, ruleConfigs, 
originalMetaDataContexts, instanceContext);
         ShardingSphereMetaData clonedMetaData = 
cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase);
         ConfigurationProperties props = 
originalMetaDataContexts.getMetaData().getProps();
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
@@ -221,7 +211,7 @@ public final class MetaDataContextsFactory {
         return new MetaDataContexts(metaData, 
ShardingSphereStatisticsFactory.create(metaData, 
persistService.getShardingSphereDataPersistService().load(metaData)));
     }
     
-    private static ShardingSphereMetaData cloneMetaData(final 
ShardingSphereMetaData originalMetaData, final ShardingSphereDatabase 
changedDatabase) {
+    private ShardingSphereMetaData cloneMetaData(final ShardingSphereMetaData 
originalMetaData, final ShardingSphereDatabase changedDatabase) {
         ShardingSphereMetaData result = new ShardingSphereMetaData(
                 originalMetaData.getAllDatabases(), 
originalMetaData.getGlobalResourceMetaData(), 
originalMetaData.getGlobalRuleMetaData(), originalMetaData.getProps());
         result.putDatabase(changedDatabase);
@@ -236,40 +226,37 @@ public final class MetaDataContextsFactory {
      * @param switchingResource switching resource
      * @param ruleConfigs rule configurations
      * @param originalMetaDataContext original meta data contexts
-     * @param persistService meta data persist service
      * @param instanceContext compute node instance context
      * @return changed database
      * @throws SQLException SQL exception
      */
-    public static ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean internalLoadMetaData,
-                                                               final 
SwitchingResource switchingResource, final Collection<RuleConfiguration> 
ruleConfigs,
-                                                               final 
MetaDataContexts originalMetaDataContext, final MetaDataPersistService 
persistService,
-                                                               final 
ComputeNodeInstanceContext instanceContext) throws SQLException {
+    public ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean internalLoadMetaData,
+                                                        final 
SwitchingResource switchingResource, final Collection<RuleConfiguration> 
ruleConfigs,
+                                                        final MetaDataContexts 
originalMetaDataContext, final ComputeNodeInstanceContext instanceContext) 
throws SQLException {
         ResourceMetaData effectiveResourceMetaData = 
getEffectiveResourceMetaData(originalMetaDataContext.getMetaData().getDatabase(databaseName),
 switchingResource);
         Collection<RuleConfiguration> toBeCreatedRuleConfigs = null == 
ruleConfigs
                 ? 
originalMetaDataContext.getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations()
                 : ruleConfigs;
         DatabaseConfiguration toBeCreatedDatabaseConfig = 
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource, 
toBeCreatedRuleConfigs);
         return 
createChangedDatabase(originalMetaDataContext.getMetaData().getDatabase(databaseName).getName(),
 internalLoadMetaData,
-                persistService, toBeCreatedDatabaseConfig, 
originalMetaDataContext.getMetaData().getProps(), instanceContext);
+                toBeCreatedDatabaseConfig, 
originalMetaDataContext.getMetaData().getProps(), instanceContext);
     }
     
-    private static ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean internalLoadMetaData, final MetaDataPersistService 
persistService,
-                                                                final 
DatabaseConfiguration databaseConfig, final ConfigurationProperties props,
-                                                                final 
ComputeNodeInstanceContext instanceContext) throws SQLException {
+    private ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean internalLoadMetaData, final DatabaseConfiguration 
databaseConfig,
+                                                         final 
ConfigurationProperties props, final ComputeNodeInstanceContext 
instanceContext) 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);
     }
     
-    private static ResourceMetaData getEffectiveResourceMetaData(final 
ShardingSphereDatabase database, final SwitchingResource resource) {
+    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);
         return new ResourceMetaData(storageNodes, storageUnits);
     }
     
-    private static Map<StorageNode, DataSource> getStorageNodes(final 
Map<StorageNode, DataSource> currentStorageNodes, final SwitchingResource 
resource) {
+    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())) {
@@ -279,7 +266,7 @@ public final class MetaDataContextsFactory {
         return result;
     }
     
-    private static Map<String, StorageUnit> getStorageUnits(final Map<String, 
StorageUnit> currentStorageUnits, final SwitchingResource resource) {
+    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())) {
@@ -289,15 +276,15 @@ public final class MetaDataContextsFactory {
         return result;
     }
     
-    private static DatabaseConfiguration getDatabaseConfiguration(final 
ResourceMetaData resourceMetaData, final SwitchingResource switchingResource,
-                                                                  final 
Collection<RuleConfiguration> toBeCreatedRuleConfigs) {
+    private DatabaseConfiguration getDatabaseConfiguration(final 
ResourceMetaData resourceMetaData,
+                                                           final 
SwitchingResource switchingResource, final Collection<RuleConfiguration> 
toBeCreatedRuleConfigs) {
         Map<String, DataSourcePoolProperties> propsMap = null == 
switchingResource ? resourceMetaData.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);
     }
     
-    private static Map<StorageNode, DataSource> 
getMergedStorageNodeDataSources(final ResourceMetaData currentResourceMetaData, 
final SwitchingResource switchingResource) {
+    private Map<StorageNode, DataSource> getMergedStorageNodeDataSources(final 
ResourceMetaData currentResourceMetaData, final SwitchingResource 
switchingResource) {
         Map<StorageNode, DataSource> result = 
currentResourceMetaData.getDataSources();
         if (null != switchingResource && 
!switchingResource.getNewDataSources().isEmpty()) {
             result.putAll(switchingResource.getNewDataSources());
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
index d8baeb451c6..08387674c4e 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
@@ -102,7 +102,7 @@ public final class DatabaseRuleConfigurationManager {
     }
     
     private void refreshMetadata(final String databaseName, final 
Collection<RuleConfiguration> ruleConfigurations) throws SQLException {
-        
metaDataContexts.update(MetaDataContextsFactory.createByAlterRule(databaseName, 
false, ruleConfigurations, metaDataContexts, metaDataPersistService, 
computeNodeInstanceContext));
+        metaDataContexts.update(new 
MetaDataContextsFactory(metaDataPersistService).createByAlterRule(databaseName, 
false, ruleConfigurations, metaDataContexts, computeNodeInstanceContext));
     }
     
     private Collection<RuleConfiguration> getRuleConfigurations(final 
Collection<ShardingSphereRule> rules) {
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
index 9d2240a9e64..3079015c6f6 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
@@ -107,8 +107,8 @@ public final class StorageUnitManager {
     }
     
     private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource) throws SQLException {
-        MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(
-                databaseName, true, switchingResource, metaDataContexts, 
metaDataPersistService, computeNodeInstanceContext);
+        MetaDataContexts reloadMetaDataContexts = new 
MetaDataContextsFactory(metaDataPersistService).createBySwitchResource(
+                databaseName, true, switchingResource, metaDataContexts, 
computeNodeInstanceContext);
         metaDataContexts.update(reloadMetaDataContexts);
         
metaDataContexts.getMetaData().putDatabase(buildDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
         switchingResource.closeStaleDataSources();
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
index 0df9edbaf47..f88f1a4fabe 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
@@ -109,7 +109,7 @@ class MetaDataContextsFactoryTest {
     void assertCreateWithJDBCInstanceMetaData() throws SQLException {
         ComputeNodeInstanceContext computeNodeInstanceContext = 
mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS);
         
when(computeNodeInstanceContext.getInstance().getMetaData()).thenReturn(mock(JDBCInstanceMetaData.class));
-        MetaDataContexts actual = 
MetaDataContextsFactory.create(metaDataPersistService, 
createContextManagerBuilderParameter(), computeNodeInstanceContext);
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistService).create(createContextManagerBuilderParameter(),
 computeNodeInstanceContext);
         
assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().size(), 
is(1));
         
assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().iterator().next(),
 instanceOf(MockedRule.class));
         assertTrue(actual.getMetaData().containsDatabase("foo_db"));
@@ -120,7 +120,7 @@ class MetaDataContextsFactoryTest {
     void assertCreateWithProxyInstanceMetaData() throws SQLException {
         
when(databaseMetaDataPersistFacade.getDatabase().loadAllDatabaseNames()).thenReturn(Collections.singletonList("foo_db"));
         
when(metaDataPersistService.getDatabaseMetaDataFacade()).thenReturn(databaseMetaDataPersistFacade);
-        MetaDataContexts actual = 
MetaDataContextsFactory.create(metaDataPersistService, 
createContextManagerBuilderParameter(), mock(ComputeNodeInstanceContext.class, 
RETURNS_DEEP_STUBS));
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistService).create(createContextManagerBuilderParameter(),
 mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS));
         
assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().size(), 
is(1));
         
assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().iterator().next(),
 instanceOf(MockedRule.class));
         assertTrue(actual.getMetaData().containsDatabase("foo_db"));
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
index 2e997abe9d2..de6545ebea9 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
@@ -60,8 +60,7 @@ public final class ClusterContextManagerBuilder implements 
ContextManagerBuilder
         ClusterPersistRepository repository = 
getClusterPersistRepository(config, computeNodeInstanceContext);
         LockContext lockContext = new ClusterLockContext(new 
GlobalLockPersistService(repository));
         computeNodeInstanceContext.init(new 
ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId()), 
lockContext);
-        MetaDataPersistService metaDataPersistService = new 
MetaDataPersistService(repository);
-        MetaDataContexts metaDataContexts = 
MetaDataContextsFactory.create(metaDataPersistService, param, 
computeNodeInstanceContext);
+        MetaDataContexts metaDataContexts = new MetaDataContextsFactory(new 
MetaDataPersistService(repository)).create(param, computeNodeInstanceContext);
         ContextManager result = new ContextManager(metaDataContexts, 
computeNodeInstanceContext, repository);
         registerOnline(computeNodeInstanceContext, param, result, repository);
         return result;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
index 5d73de6ee14..b8bc61de563 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
@@ -125,8 +125,8 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
             SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
                     
.switchByRegisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisteredProps);
             newDataSources.putAll(switchingResource.getNewDataSources());
-            MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
-                    switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+            MetaDataContexts reloadMetaDataContexts = new 
MetaDataContextsFactory(metaDataPersistService).createBySwitchResource(
+                    databaseName, false, switchingResource, 
originalMetaDataContexts, 
metaDataContextManager.getComputeNodeInstanceContext());
             
metaDataPersistService.getDataSourceUnitService().persist(databaseName, 
toBeRegisteredProps);
             afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
             reloadMetaDataContexts.getMetaData().close();
@@ -143,8 +143,8 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
             SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
                     
.switchByAlterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps);
             newDataSources.putAll(switchingResource.getNewDataSources());
-            MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
-                    switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+            MetaDataContexts reloadMetaDataContexts = new 
MetaDataContextsFactory(metaDataPersistService).createBySwitchResource(
+                    databaseName, false, switchingResource, 
originalMetaDataContexts, 
metaDataContextManager.getComputeNodeInstanceContext());
             DataSourceUnitPersistService dataSourceService = 
metaDataPersistService.getDataSourceUnitService();
             metaDataPersistService.getMetaDataVersionPersistService()
                     
.switchActiveVersion(dataSourceService.persist(databaseName, toBeUpdatedProps));
@@ -161,8 +161,8 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
             MetaDataContexts originalMetaDataContexts = 
buildOriginalMetaDataContexts();
             SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
                     
.createByUnregisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 Collections.singletonList(each));
-            MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
-                    switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+            MetaDataContexts reloadMetaDataContexts = new 
MetaDataContextsFactory(metaDataPersistService).createBySwitchResource(
+                    databaseName, false, switchingResource, 
originalMetaDataContexts, 
metaDataContextManager.getComputeNodeInstanceContext());
             
metaDataPersistService.getDataSourceUnitService().delete(databaseName, each);
             afterStorageUnitsDropped(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
             reloadMetaDataContexts.getMetaData().close();
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
index 824887b9feb..03d10bf61a1 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
@@ -22,7 +22,6 @@ import 
org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
-import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
@@ -30,6 +29,7 @@ import 
org.apache.shardingsphere.mode.manager.standalone.lock.StandaloneLockCont
 import 
org.apache.shardingsphere.mode.manager.standalone.workerid.StandaloneWorkerIdGenerator;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import 
org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepository;
 
 import java.sql.SQLException;
@@ -45,10 +45,9 @@ public final class StandaloneContextManagerBuilder 
implements ContextManagerBuil
         PersistRepositoryConfiguration repositoryConfig = 
param.getModeConfiguration().getRepository();
         StandalonePersistRepository repository = TypedSPILoader.getService(
                 StandalonePersistRepository.class, null == repositoryConfig ? 
null : repositoryConfig.getType(), null == repositoryConfig ? new Properties() 
: repositoryConfig.getProps());
-        MetaDataPersistService persistService = new 
MetaDataPersistService(repository);
         ComputeNodeInstanceContext computeNodeInstanceContext = new 
ComputeNodeInstanceContext(new 
ComputeNodeInstance(param.getInstanceMetaData()), param.getModeConfiguration(), 
eventBusContext);
         computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), new 
StandaloneLockContext());
-        MetaDataContexts metaDataContexts = 
MetaDataContextsFactory.create(persistService, param, 
computeNodeInstanceContext);
+        MetaDataContexts metaDataContexts = new MetaDataContextsFactory(new 
MetaDataPersistService(repository)).create(param, computeNodeInstanceContext);
         return new ContextManager(metaDataContexts, 
computeNodeInstanceContext, repository);
     }
     
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
index a5fbf412c1e..71354d17bd1 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
@@ -224,8 +224,8 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
     public void registerStorageUnits(final String databaseName, final 
Map<String, DataSourcePoolProperties> toBeRegisteredProps) throws SQLException {
         SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager().switchByRegisterStorageUnit(metaDataContextManager.getMetaDataContexts()
                 
.getMetaData().getDatabase(databaseName).getResourceMetaData(), 
toBeRegisteredProps);
-        ShardingSphereDatabase changedDatabase = 
MetaDataContextsFactory.createChangedDatabase(databaseName, false, 
switchingResource, null,
-                metaDataContextManager.getMetaDataContexts(), 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+        ShardingSphereDatabase changedDatabase = new 
MetaDataContextsFactory(metaDataPersistService).createChangedDatabase(databaseName,
 false, switchingResource, null,
+                metaDataContextManager.getMetaDataContexts(), 
metaDataContextManager.getComputeNodeInstanceContext());
         
metaDataContextManager.getMetaDataContexts().getMetaData().putDatabase(changedDatabase);
         
metaDataContextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules()
                 .forEach(each -> ((GlobalRule) 
each).refresh(metaDataContextManager.getMetaDataContexts().getMetaData().getAllDatabases(),
 GlobalRuleChangedType.DATABASE_CHANGED));
@@ -246,8 +246,8 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
     public void alterStorageUnits(final String databaseName, final Map<String, 
DataSourcePoolProperties> toBeUpdatedProps) throws SQLException {
         SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(metaDataContextManager.getMetaDataContexts().getMetaData()
                 .getDatabase(databaseName).getResourceMetaData(), 
toBeUpdatedProps);
-        ShardingSphereDatabase changedDatabase = 
MetaDataContextsFactory.createChangedDatabase(databaseName, true, 
switchingResource, null,
-                metaDataContextManager.getMetaDataContexts(), 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+        ShardingSphereDatabase changedDatabase = new 
MetaDataContextsFactory(metaDataPersistService).createChangedDatabase(databaseName,
 true, switchingResource, null,
+                metaDataContextManager.getMetaDataContexts(), 
metaDataContextManager.getComputeNodeInstanceContext());
         
metaDataContextManager.getMetaDataContexts().getMetaData().putDatabase(changedDatabase);
         
metaDataContextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules()
                 .forEach(each -> ((GlobalRule) 
each).refresh(metaDataContextManager.getMetaDataContexts().getMetaData().getAllDatabases(),
 GlobalRuleChangedType.DATABASE_CHANGED));
@@ -262,8 +262,8 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
     public void unregisterStorageUnits(final String databaseName, final 
Collection<String> toBeDroppedStorageUnitNames) throws SQLException {
         SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager().switchByUnregisterStorageUnit(metaDataContextManager.getMetaDataContexts().getMetaData()
                 .getDatabase(databaseName).getResourceMetaData(), 
toBeDroppedStorageUnitNames);
-        MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false, 
switchingResource,
-                metaDataContextManager.getMetaDataContexts(), 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
+        MetaDataContexts reloadMetaDataContexts = new 
MetaDataContextsFactory(metaDataPersistService).createBySwitchResource(databaseName,
 false, switchingResource,
+                metaDataContextManager.getMetaDataContexts(), 
metaDataContextManager.getComputeNodeInstanceContext());
         metaDataPersistService.persistReloadDatabaseByDrop(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
                 
metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
         metaDataContextManager.dropSchemas(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),


Reply via email to