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

sunnianjun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 8437eadf138 Implement refresh method for SQLFederationRule and remove 
useless MetaDataHeldRuleAttribute (#30522)
8437eadf138 is described below

commit 8437eadf138b46974affb6466186d9c6845843b9
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Mon Mar 18 14:37:37 2024 +0800

    Implement refresh method for SQLFederationRule and remove useless 
MetaDataHeldRuleAttribute (#30522)
    
    * fix unit test
    
    * fix checkstyle
    
    * fix sql federation e2e test
    
    * Add global rule changed type to avoid unnecessary refreshes
---
 .../infra/metadata/ShardingSphereMetaData.java     |  5 ++-
 .../infra/rule/scope/GlobalRule.java               |  3 +-
 .../GlobalRuleChangedType.java}                    | 26 ++++-------
 .../infra/metadata/ShardingSphereMetaDataTest.java |  5 ++-
 .../jdbc/adapter/PreparedStatementAdapterTest.java |  2 +-
 .../driver/jdbc/adapter/StatementAdapterTest.java  |  4 +-
 .../UnsupportedOperationPreparedStatementTest.java |  2 +-
 .../UnsupportedOperationStatementTest.java         |  2 +-
 .../SQLFederationMetaDataHeldRuleAttribute.java    | 52 ----------------------
 .../sqlfederation/rule/SQLFederationRule.java      | 27 ++++++++---
 .../rule/builder/SQLFederationRuleBuilder.java     |  2 +-
 .../engine/SQLFederationEngineTest.java            | 15 +++----
 .../optimizer/context/OptimizerContext.java        | 38 ----------------
 .../optimizer/context/OptimizerContextFactory.java |  7 +--
 .../parser/OptimizerParserContextFactory.java      |  4 +-
 .../optimizer/context/OptimizerContextTest.java    |  7 ++-
 .../transaction/rule/TransactionRule.java          |  6 ++-
 .../transaction/rule/TransactionRuleTest.java      |  3 +-
 .../context/ResourceMetaDataContextManager.java    | 38 +++++++++-------
 .../standalone/StandaloneModeContextManager.java   | 31 ++++++-------
 ...enGaussSystemCatalogAdminQueryExecutorTest.java |  8 ++--
 .../test/it/rewrite/engine/SQLRewriterIT.java      |  2 +-
 22 files changed, 108 insertions(+), 181 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 46c5b927469..36dff4d2206 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
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.attribute.datasource.StaticDataSourceRuleAttribute;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRuleChangedType;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -97,7 +98,7 @@ public final class ShardingSphereMetaData {
     public void addDatabase(final String databaseName, final DatabaseType 
protocolType, final ConfigurationProperties props) {
         ShardingSphereDatabase database = 
ShardingSphereDatabase.create(databaseName, protocolType, props);
         databases.put(database.getName().toLowerCase(), database);
-        globalRuleMetaData.getRules().forEach(each -> ((GlobalRule) 
each).refresh(databases));
+        globalRuleMetaData.getRules().forEach(each -> ((GlobalRule) 
each).refresh(databases, GlobalRuleChangedType.DATABASE_CHANGED));
     }
     
     /**
@@ -111,7 +112,7 @@ public final class ShardingSphereMetaData {
     
     @SneakyThrows(Exception.class)
     private void cleanResources(final ShardingSphereDatabase database) {
-        globalRuleMetaData.getRules().forEach(each -> ((GlobalRule) 
each).refresh(databases));
+        globalRuleMetaData.getRules().forEach(each -> ((GlobalRule) 
each).refresh(databases, GlobalRuleChangedType.DATABASE_CHANGED));
         for (ShardingSphereRule each : database.getRuleMetaData().getRules()) {
             if (each instanceof AutoCloseable) {
                 ((AutoCloseable) each).close();
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/scope/GlobalRule.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/scope/GlobalRule.java
index f18df6a6cd5..d490f568480 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/scope/GlobalRule.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/scope/GlobalRule.java
@@ -31,7 +31,8 @@ public interface GlobalRule extends ShardingSphereRule {
      * Refresh rule when databases changed.
      * 
      * @param databases changed databases
+     * @param changedType changed type
      */
-    default void refresh(final Map<String, ShardingSphereDatabase> databases) {
+    default void refresh(final Map<String, ShardingSphereDatabase> databases, 
GlobalRuleChangedType changedType) {
     }
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/attribute/metadata/MetaDataHeldRuleAttribute.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/scope/GlobalRuleChangedType.java
similarity index 58%
rename from 
infra/common/src/main/java/org/apache/shardingsphere/infra/rule/attribute/metadata/MetaDataHeldRuleAttribute.java
rename to 
infra/common/src/main/java/org/apache/shardingsphere/infra/rule/scope/GlobalRuleChangedType.java
index 492cae133b6..7e71f1472d6 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/attribute/metadata/MetaDataHeldRuleAttribute.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/scope/GlobalRuleChangedType.java
@@ -15,27 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.rule.attribute.metadata;
+package org.apache.shardingsphere.infra.rule.scope;
 
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.attribute.RuleAttribute;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 
 /**
- * Meta data held rule attribute.
+ * Global rule changed type enum.
  */
-public interface MetaDataHeldRuleAttribute extends RuleAttribute {
+@RequiredArgsConstructor
+@Getter
+public enum GlobalRuleChangedType {
     
-    /**
-     * Alter database.
-     * 
-     * @param database database
-     */
-    void alterDatabase(ShardingSphereDatabase database);
-    
-    /**
-     * Drop database.
-     * 
-     * @param databaseName database name
-     */
-    void dropDatabase(String databaseName);
+    DATABASE_CHANGED, SCHEMA_CHANGED
 }
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 97f7c6e7926..232dadf005b 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
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRuleChangedType;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
@@ -68,7 +69,7 @@ class ShardingSphereMetaDataTest {
         ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases, mock(ResourceMetaData.class), new 
RuleMetaData(Collections.singleton(globalRule)), configProps);
         metaData.addDatabase("foo_db", databaseType, configProps);
         assertThat(metaData.getDatabases(), is(databases));
-        verify(globalRule).refresh(databases);
+        verify(globalRule).refresh(databases, 
GlobalRuleChangedType.DATABASE_CHANGED);
     }
     
     @Test
@@ -84,7 +85,7 @@ class ShardingSphereMetaDataTest {
         assertTrue(metaData.getDatabases().isEmpty());
         Awaitility.await().pollDelay(10L, 
TimeUnit.MILLISECONDS).until(dataSource::isClosed);
         assertTrue(dataSource.isClosed());
-        verify(globalRule).refresh(metaData.getDatabases());
+        verify(globalRule).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.DATABASE_CHANGED);
     }
     
     @Test
diff --git 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
index d242a0d1a38..191bdf028c5 100644
--- 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
+++ 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
@@ -71,7 +71,7 @@ class PreparedStatementAdapterTest {
                 new RuleMetaData(Arrays.asList(
                         new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()),
                         new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)))));
+                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), 
Collections.emptyMap()))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase(
                 
connection.getDatabaseName()).getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
diff --git 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
index 74bd3203302..4cdb3fa62e5 100644
--- 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
+++ 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
@@ -238,7 +238,7 @@ class StatementAdapterTest {
         ShardingSphereConnection connection = 
mock(ShardingSphereConnection.class, RETURNS_DEEP_STUBS);
         RuleMetaData globalRuleMetaData = new RuleMetaData(Arrays.asList(
                 new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)),
+                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap()),
                 new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build())));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
@@ -261,7 +261,7 @@ class StatementAdapterTest {
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase("db").getProtocolType()).thenReturn(databaseType);
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new
 RuleMetaData(Arrays.asList(
                 new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)),
+                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap()),
                 new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
         ShardingSphereStatement result = new 
ShardingSphereStatement(connection);
diff --git 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
index 98b98c41158..7cfcd73fa2d 100644
--- 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
+++ 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
@@ -57,7 +57,7 @@ class UnsupportedOperationPreparedStatementTest {
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new
 RuleMetaData(Arrays.asList(
                 new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()),
                 new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)))));
+                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), 
Collections.emptyMap()))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase(
                 
connection.getDatabaseName()).getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
diff --git 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
index 74aef83e902..44a1a0922f7 100644
--- 
a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
+++ 
b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
@@ -54,7 +54,7 @@ class UnsupportedOperationStatementTest {
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase("db").getProtocolType()).thenReturn(databaseType);
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new
 RuleMetaData(
                 Arrays.asList(new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)),
+                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap()),
                         new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
         shardingSphereStatement = new ShardingSphereStatement(connection);
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationMetaDataHeldRuleAttribute.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationMetaDataHeldRuleAttribute.java
deleted file mode 100644
index b4a5ec7d4f2..00000000000
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationMetaDataHeldRuleAttribute.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sqlfederation.rule;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.rule.attribute.metadata.MetaDataHeldRuleAttribute;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.dialect.OptimizerSQLPropertiesBuilder;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContextFactory;
-
-/**
- * SQL federation meta data held rule attribute.
- */
-@RequiredArgsConstructor
-public final class SQLFederationMetaDataHeldRuleAttribute implements 
MetaDataHeldRuleAttribute {
-    
-    private final OptimizerContext optimizerContext;
-    
-    @Override
-    public void alterDatabase(final ShardingSphereDatabase database) {
-        DatabaseType databaseType = database.getProtocolType();
-        OptimizerParserContext parserContext = new 
OptimizerParserContext(databaseType, new 
OptimizerSQLPropertiesBuilder(databaseType).build());
-        optimizerContext.putParserContext(database.getName(), parserContext);
-        OptimizerPlannerContext plannerContext = 
OptimizerPlannerContextFactory.create(database, parserContext, 
optimizerContext.getSqlParserRule());
-        optimizerContext.putPlannerContext(database.getName(), plannerContext);
-    }
-    
-    @Override
-    public void dropDatabase(final String databaseName) {
-        optimizerContext.removeParserContext(databaseName);
-        optimizerContext.removePlannerContext(databaseName);
-    }
-}
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
index 344586fa406..9c53a2de294 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
@@ -18,15 +18,16 @@
 package org.apache.shardingsphere.sqlfederation.rule;
 
 import lombok.Getter;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
 import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRuleChangedType;
 import 
org.apache.shardingsphere.sqlfederation.api.config.SQLFederationRuleConfiguration;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContext;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContextFactory;
 
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * SQL federation rule.
@@ -36,13 +37,27 @@ public final class SQLFederationRule implements GlobalRule {
     
     private final SQLFederationRuleConfiguration configuration;
     
-    private final OptimizerContext optimizerContext;
+    private final AtomicReference<OptimizerContext> optimizerContext;
     
     private final RuleAttributes attributes;
     
-    public SQLFederationRule(final SQLFederationRuleConfiguration ruleConfig, 
final Map<String, ShardingSphereDatabase> databases, final 
ConfigurationProperties props) {
+    public SQLFederationRule(final SQLFederationRuleConfiguration ruleConfig, 
final Map<String, ShardingSphereDatabase> databases) {
         configuration = ruleConfig;
-        optimizerContext = OptimizerContextFactory.create(databases, props);
-        attributes = new RuleAttributes(new 
SQLFederationMetaDataHeldRuleAttribute(optimizerContext));
+        optimizerContext = new 
AtomicReference<>(OptimizerContextFactory.create(databases));
+        attributes = new RuleAttributes();
+    }
+    
+    @Override
+    public void refresh(final Map<String, ShardingSphereDatabase> databases, 
final GlobalRuleChangedType changedType) {
+        optimizerContext.set(OptimizerContextFactory.create(databases));
+    }
+    
+    /**
+     * Get optimizer context.
+     * 
+     * @return optimizer context
+     */
+    public OptimizerContext getOptimizerContext() {
+        return optimizerContext.get();
     }
 }
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
index c0954b4fa29..432a6012990 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
@@ -34,7 +34,7 @@ public final class SQLFederationRuleBuilder implements 
GlobalRuleBuilder<SQLFede
     
     @Override
     public GlobalRule build(final SQLFederationRuleConfiguration ruleConfig, 
final Map<String, ShardingSphereDatabase> databases, final 
ConfigurationProperties props) {
-        return new SQLFederationRule(ruleConfig, databases, props);
+        return new SQLFederationRule(ruleConfig, databases);
     }
     
     @Override
diff --git 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
index 8acd110e70c..5336636087b 100644
--- 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
+++ 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.sqlfederation.engine;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
@@ -63,7 +62,7 @@ class SQLFederationEngineTest {
     @Test
     void assertDecideWhenSelectStatementContainsSystemSchema() throws 
SQLException {
         Collection<ShardingSphereRule> globalRules =
-                Collections.singleton(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+                Collections.singleton(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
Collections.emptyList());
         SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
@@ -84,7 +83,7 @@ class SQLFederationEngineTest {
     void assertDecideWhenNotConfigSqlFederationEnabled() throws SQLException {
         Collection<ShardingSphereRule> globalRules =
                 Collections
-                        .singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+                        .singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
Collections.emptyList());
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 databaseType, mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), new RuleMetaData(globalRules), Collections.emptyMap());
@@ -96,7 +95,7 @@ class SQLFederationEngineTest {
     @Test
     void assertDecideWhenConfigAllQueryUseSQLFederation() throws SQLException {
         Collection<ShardingSphereRule> globalRules =
-                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, true, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, true, mock(CacheOption.class)), 
Collections.emptyMap()));
         SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
Collections.emptyList());
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 databaseType, mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), new RuleMetaData(globalRules), Collections.emptyMap());
@@ -110,7 +109,7 @@ class SQLFederationEngineTest {
     @Test
     void assertDecideWhenExecuteNotSelectStatement() throws SQLException {
         Collection<ShardingSphereRule> globalRules =
-                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
Collections.emptyList());
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 databaseType, mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), new RuleMetaData(globalRules), Collections.emptyMap());
@@ -122,7 +121,7 @@ class SQLFederationEngineTest {
     @Test
     void assertDecideWhenConfigSingleMatchedRule() throws SQLException {
         Collection<ShardingSphereRule> globalRules =
-                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         Collection<ShardingSphereRule> databaseRules = 
Collections.singletonList(new SQLFederationDeciderRuleMatchFixture());
         SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
databaseRules);
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
@@ -137,7 +136,7 @@ class SQLFederationEngineTest {
     @Test
     void assertDecideWhenConfigSingleNotMatchedRule() throws SQLException {
         Collection<ShardingSphereRule> globalRules =
-                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         Collection<ShardingSphereRule> databaseRules = 
Collections.singletonList(new SQLFederationDeciderRuleNotMatchFixture());
         SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
databaseRules);
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
@@ -151,7 +150,7 @@ class SQLFederationEngineTest {
     @Test
     void assertDecideWhenConfigMultiRule() throws SQLException {
         Collection<ShardingSphereRule> globalRules =
-                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         Collection<ShardingSphereRule> databaseRules = Arrays.asList(new 
SQLFederationDeciderRuleNotMatchFixture(),
                 new SQLFederationDeciderRuleMatchFixture());
         SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
databaseRules);
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
index b4f9da4ff87..f8fa9ce7da8 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
@@ -48,25 +48,6 @@ public final class OptimizerContext {
         return parserContexts.get(databaseName);
     }
     
-    /**
-     * Put parser context.
-     *
-     * @param databaseName database name
-     * @param parserContext parser context
-     */
-    public void putParserContext(final String databaseName, final 
OptimizerParserContext parserContext) {
-        parserContexts.put(databaseName, parserContext);
-    }
-    
-    /**
-     * Remove parser context.
-     *
-     * @param databaseName database name
-     */
-    public void removeParserContext(final String databaseName) {
-        parserContexts.remove(databaseName);
-    }
-    
     /**
      * Get planner context.
      *
@@ -76,23 +57,4 @@ public final class OptimizerContext {
     public OptimizerPlannerContext getPlannerContext(final String 
databaseName) {
         return plannerContexts.get(databaseName);
     }
-    
-    /**
-     * Put planner context.
-     * 
-     * @param databaseName database name
-     * @param plannerContext planner context
-     */
-    public void putPlannerContext(final String databaseName, final 
OptimizerPlannerContext plannerContext) {
-        plannerContexts.put(databaseName, plannerContext);
-    }
-    
-    /**
-     * Remove planner context.
-     * 
-     * @param databaseName database name
-     */
-    public void removePlannerContext(final String databaseName) {
-        plannerContexts.remove(databaseName);
-    }
 }
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
index 91d8f66ab28..0011b2ae916 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.Optimiz
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContextFactory;
 
 import java.util.Map;
+import java.util.Properties;
 
 /**
  * Optimizer context factory.
@@ -41,12 +42,12 @@ public final class OptimizerContextFactory {
      * Create optimize context.
      *
      * @param databases databases
-     * @param props props
      * @return created optimizer context
      */
-    public static OptimizerContext create(final Map<String, 
ShardingSphereDatabase> databases, final ConfigurationProperties props) {
+    public static OptimizerContext create(final Map<String, 
ShardingSphereDatabase> databases) {
         Map<String, OptimizerParserContext> parserContexts = 
OptimizerParserContextFactory.create(databases);
-        SQLParserRule sqlParserRule = new SQLParserRuleBuilder().build(new 
DefaultSQLParserRuleConfigurationBuilder().build(), databases, props);
+        // TODO consider to use sqlParserRule in global rule
+        SQLParserRule sqlParserRule = new SQLParserRuleBuilder().build(new 
DefaultSQLParserRuleConfigurationBuilder().build(), databases, new 
ConfigurationProperties(new Properties()));
         Map<String, OptimizerPlannerContext> plannerContexts = 
OptimizerPlannerContextFactory.create(databases, parserContexts, sqlParserRule);
         return new OptimizerContext(sqlParserRule, parserContexts, 
plannerContexts);
     }
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/parser/OptimizerParserContextFactory.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/parser/OptimizerParserContextFactory.java
index 1da3022d0e5..5e029871acc 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/parser/OptimizerParserContextFactory.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/parser/OptimizerParserContextFactory.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.sqlfederation.optimizer.context.parser;
 
+import com.cedarsoftware.util.CaseInsensitiveMap;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
@@ -25,7 +26,6 @@ import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.dialect.
 
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Optimizer parser context factory.
@@ -40,7 +40,7 @@ public final class OptimizerParserContextFactory {
      * @return created optimizer parser context map
      */
     public static Map<String, OptimizerParserContext> create(final Map<String, 
ShardingSphereDatabase> databases) {
-        Map<String, OptimizerParserContext> result = new ConcurrentHashMap<>();
+        Map<String, OptimizerParserContext> result = new 
CaseInsensitiveMap<>();
         for (Entry<String, ShardingSphereDatabase> entry : 
databases.entrySet()) {
             DatabaseType databaseType = entry.getValue().getProtocolType();
             result.put(entry.getKey(), new 
OptimizerParserContext(databaseType, new 
OptimizerSQLPropertiesBuilder(databaseType).build()));
diff --git 
a/kernel/sql-federation/optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
 
b/kernel/sql-federation/optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
index d1a20a05d5d..5aa122a76b0 100644
--- 
a/kernel/sql-federation/optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
+++ 
b/kernel/sql-federation/optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.sqlfederation.optimizer.context;
 
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -39,19 +38,19 @@ class OptimizerContextTest {
     
     @Test
     void assertGetSqlParserRule() {
-        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), mock(ConfigurationProperties.class));
+        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()));
         assertThat(actual.getSqlParserRule(), instanceOf(SQLParserRule.class));
     }
     
     @Test
     void assertGetParserContext() {
-        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), mock(ConfigurationProperties.class));
+        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()));
         assertThat(actual.getParserContext(DefaultDatabase.LOGIC_NAME), 
instanceOf(OptimizerParserContext.class));
     }
     
     @Test
     void assertGetPlannerContext() {
-        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), mock(ConfigurationProperties.class));
+        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()));
         assertThat(actual.getPlannerContext(DefaultDatabase.LOGIC_NAME), 
instanceOf(OptimizerPlannerContext.class));
     }
     
diff --git 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
index 848cc099e50..ae637971fe3 100644
--- 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
+++ 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/rule/TransactionRule.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRuleChangedType;
 import 
org.apache.shardingsphere.transaction.ShardingSphereTransactionManagerEngine;
 import org.apache.shardingsphere.transaction.api.TransactionType;
 import 
org.apache.shardingsphere.transaction.config.TransactionRuleConfiguration;
@@ -90,7 +91,10 @@ public final class TransactionRule implements GlobalRule, 
AutoCloseable {
     }
     
     @Override
-    public void refresh(final Map<String, ShardingSphereDatabase> databases) {
+    public void refresh(final Map<String, ShardingSphereDatabase> databases, 
final GlobalRuleChangedType changedType) {
+        if (GlobalRuleChangedType.DATABASE_CHANGED != changedType) {
+            return;
+        }
         ShardingSphereTransactionManagerEngine previousEngine = resource.get();
         if (null != previousEngine) {
             close(previousEngine);
diff --git 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
index e9887b42046..c35783c4bf0 100644
--- 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
+++ 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/TransactionRuleTest.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRuleChangedType;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.transaction.api.TransactionType;
 import 
org.apache.shardingsphere.transaction.config.TransactionRuleConfiguration;
@@ -54,7 +55,7 @@ class TransactionRuleTest {
     @Test
     void assertAddResource() {
         try (TransactionRule actual = new 
TransactionRule(createTransactionRuleConfiguration(), 
Collections.singletonMap(SHARDING_DB_1, createDatabase()))) {
-            actual.refresh(Collections.singletonMap(SHARDING_DB_2, 
createAddDatabase()));
+            actual.refresh(Collections.singletonMap(SHARDING_DB_2, 
createAddDatabase()), GlobalRuleChangedType.DATABASE_CHANGED);
             
assertThat(actual.getResource().getTransactionManager(TransactionType.XA), 
instanceOf(ShardingSphereTransactionManagerFixture.class));
         }
     }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ResourceMetaDataContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ResourceMetaDataContextManager.java
index dd2fdff0e26..e176a027a71 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ResourceMetaDataContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ResourceMetaDataContextManager.java
@@ -17,16 +17,19 @@
 
 package org.apache.shardingsphere.mode.manager.context;
 
+import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.connection.refresher.util.TableRefreshUtils;
 import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
-import 
org.apache.shardingsphere.infra.rule.attribute.metadata.MetaDataHeldRuleAttribute;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRuleChangedType;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
 import java.util.Collections;
@@ -52,15 +55,9 @@ public final class ResourceMetaDataContextManager {
         }
         DatabaseType protocolType = 
DatabaseTypeEngine.getProtocolType(Collections.emptyMap(), 
metaDataContexts.get().getMetaData().getProps());
         metaDataContexts.get().getMetaData().addDatabase(databaseName, 
protocolType, metaDataContexts.get().getMetaData().getProps());
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
-        
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getAttributes(MetaDataHeldRuleAttribute.class).forEach(each
 -> each.alterDatabase(database));
         metaDataContexts.set(new 
MetaDataContexts(metaDataContexts.get().getPersistService(), 
metaDataContexts.get().getMetaData()));
     }
     
-    private void alterMetaDataHeldRule(final ShardingSphereDatabase database) {
-        
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getAttributes(MetaDataHeldRuleAttribute.class).forEach(each
 -> each.alterDatabase(database));
-    }
-    
     /**
      * Drop database.
      *
@@ -71,7 +68,6 @@ public final class ResourceMetaDataContextManager {
             return;
         }
         
metaDataContexts.get().getMetaData().dropDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName());
-        
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getAttributes(MetaDataHeldRuleAttribute.class).forEach(each
 -> each.dropDatabase(databaseName));
     }
     
     /**
@@ -81,12 +77,13 @@ public final class ResourceMetaDataContextManager {
      * @param schemaName schema name
      */
     public synchronized void addSchema(final String databaseName, final String 
schemaName) {
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+        ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
+        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
         if (database.containsSchema(schemaName)) {
             return;
         }
         database.addSchema(schemaName, new ShardingSphereSchema());
-        alterMetaDataHeldRule(database);
+        metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
     }
     
     /**
@@ -96,15 +93,16 @@ public final class ResourceMetaDataContextManager {
      * @param schemaName schema name
      */
     public synchronized void dropSchema(final String databaseName, final 
String schemaName) {
-        if 
(!metaDataContexts.get().getMetaData().containsDatabase(databaseName)) {
+        ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
+        if (!metaData.containsDatabase(databaseName)) {
             return;
         }
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
         if (!database.containsSchema(schemaName)) {
             return;
         }
         database.dropSchema(schemaName);
-        alterMetaDataHeldRule(database);
+        metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
     }
     
     /**
@@ -116,12 +114,15 @@ public final class ResourceMetaDataContextManager {
      * @param toBeDeletedViewName to be deleted view name
      */
     public synchronized void alterSchema(final String databaseName, final 
String schemaName, final String toBeDeletedTableName, final String 
toBeDeletedViewName) {
-        if 
(!metaDataContexts.get().getMetaData().containsDatabase(databaseName) || 
!metaDataContexts.get().getMetaData().getDatabase(databaseName).containsSchema(schemaName))
 {
+        ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
+        if (!metaData.containsDatabase(databaseName) || 
!metaData.getDatabase(databaseName).containsSchema(schemaName)) {
             return;
         }
         Optional.ofNullable(toBeDeletedTableName).ifPresent(optional -> 
dropTable(databaseName, schemaName, optional));
         Optional.ofNullable(toBeDeletedViewName).ifPresent(optional -> 
dropView(databaseName, schemaName, optional));
-        
alterMetaDataHeldRule(metaDataContexts.get().getMetaData().getDatabase(databaseName));
+        if (!Strings.isNullOrEmpty(toBeDeletedTableName) || 
!Strings.isNullOrEmpty(toBeDeletedViewName)) {
+            metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
+        }
     }
     
     /**
@@ -133,12 +134,15 @@ public final class ResourceMetaDataContextManager {
      * @param toBeChangedView to be changed view
      */
     public synchronized void alterSchema(final String databaseName, final 
String schemaName, final ShardingSphereTable toBeChangedTable, final 
ShardingSphereView toBeChangedView) {
-        if 
(!metaDataContexts.get().getMetaData().containsDatabase(databaseName) || 
!metaDataContexts.get().getMetaData().getDatabase(databaseName).containsSchema(schemaName))
 {
+        ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
+        if (!metaData.containsDatabase(databaseName) || 
!metaData.getDatabase(databaseName).containsSchema(schemaName)) {
             return;
         }
         Optional.ofNullable(toBeChangedTable).ifPresent(optional -> 
alterTable(databaseName, schemaName, optional));
         Optional.ofNullable(toBeChangedView).ifPresent(optional -> 
alterView(databaseName, schemaName, optional));
-        
alterMetaDataHeldRule(metaDataContexts.get().getMetaData().getDatabase(databaseName));
+        if (null != toBeChangedTable || null != toBeChangedView) {
+            metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
+        }
     }
     
     private void dropTable(final String databaseName, final String schemaName, 
final String toBeDeletedTableName) {
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
index e1b0ad6cce6..6ae3895e59f 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.connection.refresher.util.TableRefreshUtils;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import org.apache.shardingsphere.infra.instance.mode.ModeContextManager;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
@@ -30,8 +31,8 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchema
 import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
 import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
-import 
org.apache.shardingsphere.infra.rule.attribute.metadata.MetaDataHeldRuleAttribute;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRuleChangedType;
 import 
org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
 import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
@@ -80,18 +81,20 @@ public final class StandaloneModeContextManager implements 
ModeContextManager, C
     @Override
     public void createSchema(final String databaseName, final String 
schemaName) {
         ShardingSphereSchema schema = new ShardingSphereSchema();
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
+        ShardingSphereMetaData metaData = 
contextManager.getMetaDataContexts().getMetaData();
+        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
         database.addSchema(schemaName, schema);
-        refreshMetaDataHeldRule(database);
+        metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
         
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().persist(databaseName,
 schemaName, schema);
     }
     
     @Override
     public void alterSchema(final AlterSchemaPOJO alterSchemaPOJO) {
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(alterSchemaPOJO.getDatabaseName());
+        ShardingSphereMetaData metaData = 
contextManager.getMetaDataContexts().getMetaData();
+        ShardingSphereDatabase database = 
metaData.getDatabase(alterSchemaPOJO.getDatabaseName());
         putSchemaMetaData(database, alterSchemaPOJO.getSchemaName(), 
alterSchemaPOJO.getRenameSchemaName(), 
alterSchemaPOJO.getLogicDataSourceName());
         removeSchemaMetaData(database, alterSchemaPOJO.getSchemaName());
-        refreshMetaDataHeldRule(database);
+        metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
         DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
         databaseMetaDataService.persist(alterSchemaPOJO.getDatabaseName(), 
alterSchemaPOJO.getRenameSchemaName(), 
database.getSchema(alterSchemaPOJO.getRenameSchemaName()));
         
databaseMetaDataService.getViewMetaDataPersistService().persist(alterSchemaPOJO.getDatabaseName(),
 alterSchemaPOJO.getRenameSchemaName(),
@@ -174,7 +177,8 @@ public final class StandaloneModeContextManager implements 
ModeContextManager, C
     public void dropSchema(final String databaseName, final Collection<String> 
schemaNames) {
         Collection<String> tobeRemovedTables = new LinkedHashSet<>();
         Collection<String> tobeRemovedSchemas = new LinkedHashSet<>();
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
+        ShardingSphereMetaData metaData = 
contextManager.getMetaDataContexts().getMetaData();
+        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
         for (String each : schemaNames) {
             ShardingSphereSchema schema = new 
ShardingSphereSchema(database.getSchema(each).getTables(), 
database.getSchema(each).getViews());
             database.dropSchema(each);
@@ -182,19 +186,20 @@ public final class StandaloneModeContextManager 
implements ModeContextManager, C
             tobeRemovedSchemas.add(each.toLowerCase());
         }
         
removeDataNode(database.getRuleMetaData().getAttributes(MutableDataNodeRuleAttribute.class),
 tobeRemovedSchemas, tobeRemovedTables);
-        refreshMetaDataHeldRule(database);
+        metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
     }
     
     @Override
     public void alterSchemaMetaData(final AlterSchemaMetaDataPOJO 
alterSchemaMetaDataPOJO) {
         String databaseName = alterSchemaMetaDataPOJO.getDatabaseName();
         String schemaName = alterSchemaMetaDataPOJO.getSchemaName();
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
+        ShardingSphereMetaData metaData = 
contextManager.getMetaDataContexts().getMetaData();
+        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
         Map<String, ShardingSphereTable> tables = 
alterSchemaMetaDataPOJO.getAlteredTables().stream().collect(Collectors.toMap(ShardingSphereTable::getName,
 table -> table));
         Map<String, ShardingSphereView> views = 
alterSchemaMetaDataPOJO.getAlteredViews().stream().collect(Collectors.toMap(ShardingSphereView::getName,
 view -> view));
         addDataNode(database, 
alterSchemaMetaDataPOJO.getLogicDataSourceName(), schemaName, tables, views);
         removeDataNode(database, schemaName, 
alterSchemaMetaDataPOJO.getDroppedTables(), 
alterSchemaMetaDataPOJO.getDroppedViews());
-        refreshMetaDataHeldRule(database);
+        metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
         DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
         
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, 
schemaName, tables);
         
databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, 
schemaName, views);
@@ -202,17 +207,13 @@ public final class StandaloneModeContextManager 
implements ModeContextManager, C
         alterSchemaMetaDataPOJO.getDroppedViews().forEach(each -> 
databaseMetaDataService.getViewMetaDataPersistService().delete(databaseName, 
schemaName, each));
     }
     
-    private void refreshMetaDataHeldRule(final ShardingSphereDatabase 
database) {
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getAttributes(MetaDataHeldRuleAttribute.class).forEach(each
 -> each.alterDatabase(database));
-    }
-    
     @Override
     public void registerStorageUnits(final String databaseName, final 
Map<String, DataSourcePoolProperties> toBeRegisteredProps) throws SQLException {
         SwitchingResource switchingResource =
                 new 
ResourceSwitchManager().registerStorageUnit(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisteredProps);
         
contextManager.getMetaDataContexts().getMetaData().getDatabases().putAll(contextManager.getConfigurationContextManager().createChangedDatabases(databaseName,
 false, switchingResource, null));
         
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules()
-                .forEach(each -> ((GlobalRule) 
each).refresh(contextManager.getMetaDataContexts().getMetaData().getDatabases()));
+                .forEach(each -> ((GlobalRule) 
each).refresh(contextManager.getMetaDataContexts().getMetaData().getDatabases(),
 GlobalRuleChangedType.DATABASE_CHANGED));
         
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getSchemas()
                 .forEach((schemaName, schema) -> 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService()
                         
.persist(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
@@ -227,7 +228,7 @@ public final class StandaloneModeContextManager implements 
ModeContextManager, C
                 new 
ResourceSwitchManager().alterStorageUnit(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps);
         
contextManager.getMetaDataContexts().getMetaData().getDatabases().putAll(contextManager.getConfigurationContextManager().createChangedDatabases(databaseName,
 true, switchingResource, null));
         
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules()
-                .forEach(each -> ((GlobalRule) 
each).refresh(contextManager.getMetaDataContexts().getMetaData().getDatabases()));
+                .forEach(each -> ((GlobalRule) 
each).refresh(contextManager.getMetaDataContexts().getMetaData().getDatabases(),
 GlobalRuleChangedType.DATABASE_CHANGED));
         
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().append(
                 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 toBeUpdatedProps);
         switchingResource.closeStaleDataSources();
diff --git 
a/proxy/backend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemCatalogAdminQueryExecutorTest.java
 
b/proxy/backend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemCatalogAdminQueryExecutorTest.java
index b8e9927ca34..c57834e57c2 100644
--- 
a/proxy/backend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemCatalogAdminQueryExecutorTest.java
+++ 
b/proxy/backend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussSystemCatalogAdminQueryExecutorTest.java
@@ -82,7 +82,7 @@ class OpenGaussSystemCatalogAdminQueryExecutorTest {
         ConnectionSession connectionSession = mock(ConnectionSession.class);
         
when(connectionSession.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "openGauss"));
         Map<String, ShardingSphereDatabase> databases = 
createShardingSphereDatabaseMap();
-        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases, 
props);
+        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases);
         
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(mock(RuleMetaData.class));
         OpenGaussSelectStatement sqlStatement = 
createSelectStatementForPgDatabase();
         ShardingSphereMetaData metaData =
@@ -146,7 +146,7 @@ class OpenGaussSystemCatalogAdminQueryExecutorTest {
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
         
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(props);
         Map<String, ShardingSphereDatabase> databases = 
createShardingSphereDatabaseMap();
-        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases, 
props);
+        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases);
         OpenGaussSelectStatement sqlStatement = 
createSelectStatementForVersion();
         ShardingSphereMetaData metaData =
                 new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), new 
RuleMetaData(Collections.singletonList(sqlFederationRule)), props);
@@ -180,7 +180,7 @@ class OpenGaussSystemCatalogAdminQueryExecutorTest {
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
         
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(props);
         Map<String, ShardingSphereDatabase> databases = 
createShardingSphereDatabaseMap();
-        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases, 
props);
+        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases);
         OpenGaussSelectStatement sqlStatement = 
createSelectStatementForGsPasswordDeadlineAndIntervalToNum();
         ShardingSphereMetaData metaData =
                 new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), new 
RuleMetaData(Collections.singletonList(sqlFederationRule)), props);
@@ -216,7 +216,7 @@ class OpenGaussSystemCatalogAdminQueryExecutorTest {
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
         
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(props);
         Map<String, ShardingSphereDatabase> databases = 
createShardingSphereDatabaseMap();
-        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases, 
props);
+        SQLFederationRule sqlFederationRule = new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, new CacheOption(1, 1)), databases);
         OpenGaussSelectStatement sqlStatement = 
createSelectStatementForGsPasswordNotifyTime();
         ShardingSphereMetaData metaData =
                 new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), new 
RuleMetaData(Collections.singletonList(sqlFederationRule)), props);
diff --git 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
index 4df1b6e7250..5aeadcb6728 100644
--- 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
+++ 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
@@ -169,7 +169,7 @@ public abstract class SQLRewriterIT {
     private Collection<ShardingSphereRule> createGlobalRules() {
         Collection<ShardingSphereRule> result = new LinkedList<>();
         result.add(new SQLTranslatorRule(new 
DefaultSQLTranslatorRuleConfigurationBuilder().build()));
-        result.add(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
+        result.add(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         result.add(new 
TimestampServiceRule(mock(TimestampServiceRuleConfiguration.class)));
         return result;
     }

Reply via email to