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

duanzhengqiang 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 5b4010f1b1f refactor event for meta data refresher (#18110)
5b4010f1b1f is described below

commit 5b4010f1b1fc88dc5a33de3d55e53d153b3b76dc
Author: Haoran Meng <[email protected]>
AuthorDate: Wed Jun 1 11:07:11 2022 +0800

    refactor event for meta data refresher (#18110)
---
 .../infra/instance/InstanceContext.java             |  9 +++++++++
 .../database/schema/event/AddSchemaEvent.java       |  2 +-
 .../database/schema/event/AlterSchemaEvent.java     |  2 +-
 .../{AddSchemaEvent.java => DropIndexEvent.java}    | 13 ++++++-------
 .../database/schema/event/DropSchemaEvent.java      |  2 +-
 ...SchemaEvent.java => MetaDataRefreshedEvent.java} | 13 ++-----------
 .../database/schema/event/SchemaAlteredEvent.java   |  2 +-
 .../context/refresher/MetaDataRefreshEngine.java    |  9 ++++++---
 .../infra/context/refresher/MetaDataRefresher.java  |  7 +++++--
 .../type/AlterIndexStatementSchemaRefresher.java    | 13 ++++++++-----
 .../type/AlterSchemaStatementSchemaRefresher.java   | 12 +++++++-----
 .../type/AlterTableStatementSchemaRefresher.java    | 10 ++++++----
 .../type/AlterViewStatementSchemaRefresher.java     | 10 ++++++----
 .../type/CreateIndexStatementSchemaRefresher.java   | 13 ++++++++-----
 .../type/CreateSchemaStatementSchemaRefresher.java  | 12 +++++++-----
 .../type/CreateTableStatementSchemaRefresher.java   | 21 ++++++++++++---------
 .../type/CreateViewStatementSchemaRefresher.java    | 21 ++++++++++++---------
 .../type/DropIndexStatementSchemaRefresher.java     | 21 +++++++++++++--------
 .../type/DropSchemaStatementSchemaRefresher.java    | 10 ++++++----
 .../type/DropTableStatementSchemaRefresher.java     | 11 +++++++----
 .../type/DropViewStatementSchemaRefresher.java      | 11 +++++++----
 .../type/RenameTableStatementSchemaRefresher.java   | 10 ++++++----
 .../type/DummyDropDatabaseMetaDataRefresher.java    |  9 +++++++--
 .../RenameTableStatementSchemaRefresherTest.java    | 17 ++++++++++-------
 .../driver/executor/DriverExecutor.java             |  2 +-
 .../driver/executor/DriverJDBCExecutor.java         | 16 +++++++++++++---
 .../SchemaMetaDataRegistrySubscriber.java           | 10 ++++++++++
 .../communication/DatabaseCommunicationEngine.java  |  7 ++++++-
 28 files changed, 184 insertions(+), 111 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
index 3e08608b5c0..a17fa712026 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
@@ -200,4 +200,13 @@ public final class InstanceContext {
     public void initLockContext() {
         lockContext.initLockState(this);
     }
+    
+    /**
+     * Is cluster instance or not.
+     * 
+     * @return true if is cluster, else false
+     */
+    public boolean isCluster() {
+        return "Cluster".equalsIgnoreCase(modeConfiguration.getType());
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
index fb1bb8da16d..b0e690a9511 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
@@ -25,7 +25,7 @@ import lombok.RequiredArgsConstructor;
  */
 @RequiredArgsConstructor
 @Getter
-public final class AddSchemaEvent {
+public final class AddSchemaEvent implements MetaDataRefreshedEvent {
     
     private final String databaseName;
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AlterSchemaEvent.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AlterSchemaEvent.java
index 316bcedc45d..641bb803800 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AlterSchemaEvent.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AlterSchemaEvent.java
@@ -26,7 +26,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.
  */
 @RequiredArgsConstructor
 @Getter
-public final class AlterSchemaEvent {
+public final class AlterSchemaEvent implements MetaDataRefreshedEvent {
     
     private final String databaseName;
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/DropIndexEvent.java
similarity index 80%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/DropIndexEvent.java
index fb1bb8da16d..c061ce81572 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/DropIndexEvent.java
@@ -18,16 +18,15 @@
 package org.apache.shardingsphere.infra.metadata.database.schema.event;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+
+import java.util.LinkedList;
+import java.util.List;
 
 /**
- * Add schema event.
+ * Drop index event.
  */
-@RequiredArgsConstructor
 @Getter
-public final class AddSchemaEvent {
-    
-    private final String databaseName;
+public final class DropIndexEvent implements MetaDataRefreshedEvent {
     
-    private final String schemaName;
+    private List<SchemaAlteredEvent> schemaAlteredEvents = new LinkedList<>();
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/DropSchemaEvent.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/DropSchemaEvent.java
index 29e246fda8a..34fe24bb86c 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/DropSchemaEvent.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/DropSchemaEvent.java
@@ -27,7 +27,7 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Getter
-public final class DropSchemaEvent {
+public final class DropSchemaEvent implements MetaDataRefreshedEvent {
     
     private final String databaseName;
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/MetaDataRefreshedEvent.java
similarity index 78%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/MetaDataRefreshedEvent.java
index fb1bb8da16d..db4221daaab 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/AddSchemaEvent.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/MetaDataRefreshedEvent.java
@@ -17,17 +17,8 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.event;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
 /**
- * Add schema event.
+ * Meta data refreshed event.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AddSchemaEvent {
-    
-    private final String databaseName;
-    
-    private final String schemaName;
+public interface MetaDataRefreshedEvent {
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
index 215d09ecc5f..24bc40140b3 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/event/SchemaAlteredEvent.java
@@ -27,7 +27,7 @@ import java.util.Collection;
  * Schema altered event.
  */
 @Getter
-public final class SchemaAlteredEvent {
+public final class SchemaAlteredEvent implements MetaDataRefreshedEvent {
     
     private final String databaseName;
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java
index c3a6a54756d..01ed9b71c66 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.sql.SQLException;
@@ -57,20 +58,22 @@ public final class MetaDataRefreshEngine {
      * @param sqlStatementContext SQL statement context
      * @param logicDataSourceNamesSupplier logic data source names supplier
      * @throws SQLException SQL exception
+     * @return meta data refreshed event
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public void refresh(final SQLStatementContext<?> sqlStatementContext, 
final Supplier<Collection<String>> logicDataSourceNamesSupplier) throws 
SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
SQLStatementContext<?> sqlStatementContext, final Supplier<Collection<String>> 
logicDataSourceNamesSupplier) throws SQLException {
         Class<? extends SQLStatement> sqlStatementClass = 
sqlStatementContext.getSqlStatement().getClass();
         if (IGNORABLE_SQL_STATEMENT_CLASSES.contains(sqlStatementClass)) {
-            return;
+            return Optional.empty();
         }
         Optional<MetaDataRefresher> schemaRefresher = 
MetaDataRefresherFactory.findInstance(sqlStatementClass);
         if (schemaRefresher.isPresent()) {
             String schemaName = 
sqlStatementContext.getTablesContext().getSchemaName()
                     .orElseGet(() -> 
DatabaseTypeEngine.getDefaultSchemaName(sqlStatementContext.getDatabaseType(), 
database.getName()));
-            schemaRefresher.get().refresh(database, federationMetaData, 
optimizerPlanners, logicDataSourceNamesSupplier.get(), schemaName, 
sqlStatementContext.getSqlStatement(), props);
+            return schemaRefresher.get().refresh(database, federationMetaData, 
optimizerPlanners, logicDataSourceNamesSupplier.get(), schemaName, 
sqlStatementContext.getSqlStatement(), props);
         } else {
             IGNORABLE_SQL_STATEMENT_CLASSES.add(sqlStatementClass);
         }
+        return Optional.empty();
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java
index 2d0baf55ad7..be1b8a62174 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import org.apache.shardingsphere.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.spi.type.typed.TypedSPI;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -28,6 +29,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * Meta data refresher.
@@ -47,8 +49,9 @@ public interface MetaDataRefresher<T extends SQLStatement> 
extends TypedSPI {
      * @param schemaName schema name
      * @param sqlStatement SQL statement
      * @param props configuration properties
+     * @return meta data refreshed event
      * @throws SQLException SQL exception
      */
-    void refresh(ShardingSphereDatabase database, FederationDatabaseMetaData 
federationDatabaseMetaData, Map<String, OptimizerPlannerContext> 
optimizerPlanners,
-                 Collection<String> logicDataSourceNames, String schemaName, T 
sqlStatement, ConfigurationProperties props) throws SQLException;
+    Optional<MetaDataRefreshedEvent> refresh(ShardingSphereDatabase database, 
FederationDatabaseMetaData federationDatabaseMetaData, Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                             Collection<String> 
logicDataSourceNames, String schemaName, T sqlStatement, 
ConfigurationProperties props) throws SQLException;
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java
index 272db900c0f..8c626210779 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java
@@ -20,13 +20,13 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereIndex;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterIndexStatement;
@@ -45,11 +45,13 @@ public final class AlterIndexStatementSchemaRefresher 
implements MetaDataRefresh
     private static final String TYPE = AlterIndexStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final AlterIndexStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final AlterIndexStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         Optional<IndexSegment> renameIndex = 
AlterIndexStatementHandler.getRenameIndexSegment(sqlStatement);
         if (!sqlStatement.getIndex().isPresent() || !renameIndex.isPresent()) {
-            return;
+            return Optional.empty();
         }
         String actualSchemaName = 
sqlStatement.getIndex().get().getOwner().map(optional -> 
optional.getIdentifier().getValue()).orElse(schemaName);
         String indexName = 
sqlStatement.getIndex().get().getIndexName().getIdentifier().getValue();
@@ -62,8 +64,9 @@ public final class AlterIndexStatementSchemaRefresher 
implements MetaDataRefresh
             table.getIndexes().put(renameIndexName, new 
ShardingSphereIndex(renameIndexName));
             SchemaAlteredEvent event = new 
SchemaAlteredEvent(database.getName(), actualSchemaName);
             event.getAlteredTables().add(table);
-            ShardingSphereEventBus.getInstance().post(event);
+            return Optional.of(event);
         }
+        return Optional.empty();
     }
     
     private Optional<String> findLogicTableName(final ShardingSphereSchema 
schema, final String indexName) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
index a5df39eac7e..837f4d91db2 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
@@ -19,13 +19,13 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.AlterSchemaEvent;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterSchemaStatement;
@@ -45,18 +45,20 @@ public final class AlterSchemaStatementSchemaRefresher 
implements MetaDataRefres
     private static final String TYPE = AlterSchemaStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final AlterSchemaStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final AlterSchemaStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         Optional<IdentifierValue> renameSchemaName = 
AlterSchemaStatementHandler.getRenameSchema(sqlStatement);
         if (!renameSchemaName.isPresent()) {
-            return;
+            return Optional.empty();
         }
         String actualSchemaName = sqlStatement.getSchemaName().getValue();
         putSchemaMetaData(database, federationDatabaseMetaData, 
optimizerPlanners, actualSchemaName, renameSchemaName.get().getValue(), 
logicDataSourceNames);
         removeSchemaMetaData(database, federationDatabaseMetaData, 
optimizerPlanners, actualSchemaName);
         AlterSchemaEvent event = new AlterSchemaEvent(
                 database.getName(), actualSchemaName, 
renameSchemaName.get().getValue(), 
database.getSchemas().get(renameSchemaName.get().getValue()));
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     private void removeSchemaMetaData(final ShardingSphereDatabase database, 
final FederationDatabaseMetaData federationDatabaseMetaData,
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java
index 014262ce193..a644a864992 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
@@ -28,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
@@ -47,8 +47,10 @@ public final class AlterTableStatementSchemaRefresher 
implements MetaDataRefresh
     private static final String TYPE = AlterTableStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final AlterTableStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final AlterTableStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
         SchemaAlteredEvent event = new SchemaAlteredEvent(database.getName(), 
schemaName);
         if (sqlStatement.getRenameTable().isPresent()) {
@@ -61,7 +63,7 @@ public final class AlterTableStatementSchemaRefresher 
implements MetaDataRefresh
             putTableMetaData(database, federationDatabaseMetaData, 
optimizerPlanners, logicDataSourceNames, schemaName, tableName, props);
             
event.getAlteredTables().add(database.getSchemas().get(schemaName).get(tableName));
         }
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     private void removeTableMetaData(final ShardingSphereDatabase database, 
final FederationDatabaseMetaData federationDatabaseMetaData,
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java
index 8e6dc533082..e765e73c2ad 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
@@ -28,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
@@ -49,8 +49,10 @@ public final class AlterViewStatementSchemaRefresher 
implements MetaDataRefreshe
     private static final String TYPE = AlterViewStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final AlterViewStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final AlterViewStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         String viewName = 
sqlStatement.getView().getTableName().getIdentifier().getValue();
         SchemaAlteredEvent event = new SchemaAlteredEvent(database.getName(), 
schemaName);
         Optional<SimpleTableSegment> renameView = 
AlterViewStatementHandler.getRenameView(sqlStatement);
@@ -64,7 +66,7 @@ public final class AlterViewStatementSchemaRefresher 
implements MetaDataRefreshe
             putTableMetaData(database, federationDatabaseMetaData, 
optimizerPlanners, logicDataSourceNames, schemaName, viewName, props);
             
event.getAlteredTables().add(database.getSchemas().get(schemaName).get(viewName));
         }
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     private void removeTableMetaData(final ShardingSphereDatabase database, 
final FederationDatabaseMetaData federationDatabaseMetaData,
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java
index e86ce6efcd8..860ebaec475 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java
@@ -20,11 +20,11 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 import com.google.common.base.Strings;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereIndex;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtil;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateIndexStatement;
@@ -32,6 +32,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateIndex
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * Schema refresher for create index statement.
@@ -41,18 +42,20 @@ public final class CreateIndexStatementSchemaRefresher 
implements MetaDataRefres
     private static final String TYPE = CreateIndexStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final CreateIndexStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final CreateIndexStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         String indexName = null != sqlStatement.getIndex() ? 
sqlStatement.getIndex().getIndexName().getIdentifier().getValue()
                 : 
IndexMetaDataUtil.getGeneratedLogicIndexName(sqlStatement.getColumns());
         if (Strings.isNullOrEmpty(indexName)) {
-            return;
+            return Optional.empty();
         }
         String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
         
database.getSchemas().get(schemaName).get(tableName).getIndexes().put(indexName,
 new ShardingSphereIndex(indexName));
         SchemaAlteredEvent event = new SchemaAlteredEvent(database.getName(), 
schemaName);
         
event.getAlteredTables().add(database.getSchemas().get(schemaName).get(tableName));
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     @Override
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java
index 484524c6977..c8624481fab 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
@@ -27,6 +26,7 @@ import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationS
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.AddSchemaEvent;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.CreateSchemaStatementHandler;
@@ -45,18 +45,20 @@ public final class CreateSchemaStatementSchemaRefresher 
implements MetaDataRefre
     private static final String TYPE = CreateSchemaStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final CreateSchemaStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final CreateSchemaStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         Optional<IdentifierValue> schema = 
sqlStatement.getSchemaName().isPresent() ? sqlStatement.getSchemaName() : 
CreateSchemaStatementHandler.getUsername(sqlStatement);
         if (!schema.isPresent()) {
-            return;
+            return Optional.empty();
         }
         String actualSchemaName = schema.get().getValue();
         database.getSchemas().put(actualSchemaName, new 
ShardingSphereSchema());
         federationDatabaseMetaData.putSchemaMetadata(actualSchemaName, new 
FederationSchemaMetaData(actualSchemaName, new LinkedHashMap<>()));
         optimizerPlanners.put(federationDatabaseMetaData.getName(), 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
         AddSchemaEvent event = new AddSchemaEvent(database.getName(), 
actualSchemaName);
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     @Override
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
index 167160a4a9b..1bb9a3720e1 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
@@ -28,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
@@ -47,8 +47,10 @@ public final class CreateTableStatementSchemaRefresher 
implements MetaDataRefres
     private static final String TYPE = CreateTableStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final CreateTableStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final CreateTableStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
         if (!containsInImmutableDataNodeContainedRule(tableName, database)) {
             
database.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
@@ -57,14 +59,15 @@ public final class CreateTableStatementSchemaRefresher 
implements MetaDataRefres
                 database.getResource().getDatabaseType(), 
database.getResource().getDataSources(), database.getRuleMetaData().getRules(), 
props, schemaName);
         Map<String, ShardingSphereSchema> schemaMap = 
GenericSchemaBuilder.build(Collections.singletonList(tableName), materials);
         Optional<ShardingSphereTable> actualTableMetaData = 
Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> 
optional.getTables().get(tableName));
-        actualTableMetaData.ifPresent(optional -> {
-            database.getSchemas().get(schemaName).put(tableName, optional);
-            federationDatabaseMetaData.putTable(schemaName, optional);
+        if (actualTableMetaData.isPresent()) {
+            database.getSchemas().get(schemaName).put(tableName, 
actualTableMetaData.get());
+            federationDatabaseMetaData.putTable(schemaName, 
actualTableMetaData.get());
             optimizerPlanners.put(federationDatabaseMetaData.getName(), 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
             SchemaAlteredEvent event = new 
SchemaAlteredEvent(database.getName(), schemaName);
-            event.getAlteredTables().add(optional);
-            ShardingSphereEventBus.getInstance().post(event);
-        });
+            event.getAlteredTables().add(actualTableMetaData.get());
+            return Optional.of(event);
+        }
+        return Optional.empty();
     }
     
     private boolean containsInImmutableDataNodeContainedRule(final String 
tableName, final ShardingSphereDatabase database) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
index 09c79d13f59..d66278e505a 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
@@ -28,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
@@ -47,8 +47,10 @@ public final class CreateViewStatementSchemaRefresher 
implements MetaDataRefresh
     private static final String TYPE = CreateViewStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final CreateViewStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final CreateViewStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         String viewName = 
sqlStatement.getView().getTableName().getIdentifier().getValue();
         if (!containsInImmutableDataNodeContainedRule(viewName, database)) {
             
database.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> 
each.put(logicDataSourceNames.iterator().next(), schemaName, viewName));
@@ -57,14 +59,15 @@ public final class CreateViewStatementSchemaRefresher 
implements MetaDataRefresh
                 database.getResource().getDatabaseType(), 
database.getResource().getDataSources(), database.getRuleMetaData().getRules(), 
props, schemaName);
         Map<String, ShardingSphereSchema> schemaMap = 
GenericSchemaBuilder.build(Collections.singletonList(viewName), materials);
         Optional<ShardingSphereTable> actualViewMetaData = 
Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> 
optional.getTables().get(viewName));
-        actualViewMetaData.ifPresent(optional -> {
-            database.getSchemas().get(schemaName).put(viewName, optional);
-            federationDatabaseMetaData.putTable(schemaName, optional);
+        if (actualViewMetaData.isPresent()) {
+            database.getSchemas().get(schemaName).put(viewName, 
actualViewMetaData.get());
+            federationDatabaseMetaData.putTable(schemaName, 
actualViewMetaData.get());
             optimizerPlanners.put(federationDatabaseMetaData.getName(), 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
             SchemaAlteredEvent event = new 
SchemaAlteredEvent(database.getName(), schemaName);
-            event.getAlteredTables().add(optional);
-            ShardingSphereEventBus.getInstance().post(event);
-        });
+            event.getAlteredTables().add(actualViewMetaData.get());
+            return Optional.of(event);
+        }
+        return Optional.empty();
     }
     
     private boolean containsInImmutableDataNodeContainedRule(final String 
tableName, final ShardingSphereDatabase database) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java
index ea1926ba78d..9fcf7f1ec0e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java
@@ -19,12 +19,13 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.DropIndexEvent;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtil;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
@@ -46,8 +47,11 @@ public final class DropIndexStatementSchemaRefresher 
implements MetaDataRefreshe
     private static final String TYPE = DropIndexStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final DropIndexStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final DropIndexStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
+        DropIndexEvent event = new DropIndexEvent();
         for (IndexSegment each : sqlStatement.getIndexes()) {
             String actualSchemaName = each.getOwner().map(optional -> 
optional.getIdentifier().getValue()).orElse(schemaName);
             Optional<String> logicTableName = findLogicTableName(database, 
sqlStatement, Collections.singletonList(each));
@@ -56,8 +60,9 @@ public final class DropIndexStatementSchemaRefresher 
implements MetaDataRefreshe
             }
             ShardingSphereTable table = 
database.getSchemas().get(actualSchemaName).get(logicTableName.get());
             
table.getIndexes().remove(each.getIndexName().getIdentifier().getValue());
-            post(database.getName(), actualSchemaName, table);
+            
event.getSchemaAlteredEvents().add(buildSchemaAlteredEvent(database.getName(), 
actualSchemaName, table));
         }
+        return Optional.of(event);
     }
     
     private Optional<String> findLogicTableName(final ShardingSphereDatabase 
database, final DropIndexStatement sqlStatement, final Collection<IndexSegment> 
indexSegments) {
@@ -69,10 +74,10 @@ public final class DropIndexStatementSchemaRefresher 
implements MetaDataRefreshe
         return tableNames.isEmpty() ? Optional.empty() : 
Optional.of(tableNames.iterator().next().getTableName());
     }
     
-    private void post(final String databaseName, final String schemaName, 
final ShardingSphereTable table) {
-        SchemaAlteredEvent event = new SchemaAlteredEvent(databaseName, 
schemaName);
-        event.getAlteredTables().add(table);
-        ShardingSphereEventBus.getInstance().post(event);
+    private SchemaAlteredEvent buildSchemaAlteredEvent(final String 
databaseName, final String schemaName, final ShardingSphereTable table) {
+        SchemaAlteredEvent result = new SchemaAlteredEvent(databaseName, 
schemaName);
+        result.getAlteredTables().add(table);
+        return result;
     }
     
     @Override
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
index 54f599e0f35..9f3008dcad0 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
@@ -19,12 +19,12 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.DropSchemaEvent;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
@@ -44,8 +44,10 @@ public final class DropSchemaStatementSchemaRefresher 
implements MetaDataRefresh
     private static final String TYPE = DropSchemaStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final DropSchemaStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final DropSchemaStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         Collection<String> tobeRemovedTables = new LinkedHashSet<>();
         Collection<String> tobeRemovedSchemas = new LinkedHashSet<>();
         Collection<String> schemaNames = getSchemaNames(sqlStatement);
@@ -59,7 +61,7 @@ public final class DropSchemaStatementSchemaRefresher 
implements MetaDataRefresh
         for (String each : tobeRemovedTables) {
             removeDataNode(rules, each, tobeRemovedSchemas);
         }
-        ShardingSphereEventBus.getInstance().post(new 
DropSchemaEvent(database.getName(), schemaNames));
+        return Optional.of(new DropSchemaEvent(database.getName(), 
schemaNames));
     }
     
     private Collection<String> getSchemaNames(final DropSchemaStatement 
sqlStatement) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java
index 15c42a962e7..22fa97d367f 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java
@@ -19,11 +19,11 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -32,6 +32,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropTableSt
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * Schema refresher for drop table statement.
@@ -41,8 +42,10 @@ public final class DropTableStatementSchemaRefresher 
implements MetaDataRefreshe
     private static final String TYPE = DropTableStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final DropTableStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final DropTableStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         SchemaAlteredEvent event = new SchemaAlteredEvent(database.getName(), 
schemaName);
         sqlStatement.getTables().forEach(each -> {
             
database.getSchemas().get(schemaName).remove(each.getTableName().getIdentifier().getValue());
@@ -54,7 +57,7 @@ public final class DropTableStatementSchemaRefresher 
implements MetaDataRefreshe
         for (SimpleTableSegment each : sqlStatement.getTables()) {
             removeDataNode(rules, each, schemaName);
         }
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     private void removeDataNode(final Collection<MutableDataNodeRule> rules, 
final SimpleTableSegment tobeRemovedSegment, final String schemaName) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
index 416b3d6fd47..6f0624b4c75 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
@@ -19,10 +19,10 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -31,6 +31,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropViewSta
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * Schema refresher for drop view statement.
@@ -40,8 +41,10 @@ public final class DropViewStatementSchemaRefresher 
implements MetaDataRefresher
     private static final String TYPE = DropViewStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final DropViewStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final DropViewStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         SchemaAlteredEvent event = new SchemaAlteredEvent(database.getName(), 
schemaName);
         sqlStatement.getViews().forEach(each -> {
             
database.getSchemas().get(schemaName).remove(each.getTableName().getIdentifier().getValue());
@@ -51,7 +54,7 @@ public final class DropViewStatementSchemaRefresher 
implements MetaDataRefresher
         for (SimpleTableSegment each : sqlStatement.getViews()) {
             removeDataNode(rules, each, schemaName);
         }
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     private void removeDataNode(final Collection<MutableDataNodeRule> rules, 
final SimpleTableSegment tobeRemovedSegment, final String schemaName) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java
index 375f11d6f98..74bd82758c5 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.infra.context.refresher.type;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
@@ -28,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
@@ -48,8 +48,10 @@ public final class RenameTableStatementSchemaRefresher 
implements MetaDataRefres
     private static final String TYPE = RenameTableStatement.class.getName();
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final RenameTableStatement sqlStatement, final 
ConfigurationProperties props) throws SQLException {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final RenameTableStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) throws SQLException {
         SchemaAlteredEvent event = new SchemaAlteredEvent(database.getName(), 
schemaName);
         for (RenameTableDefinitionSegment each : 
sqlStatement.getRenameTables()) {
             String tableName = 
each.getTable().getTableName().getIdentifier().getValue();
@@ -59,7 +61,7 @@ public final class RenameTableStatementSchemaRefresher 
implements MetaDataRefres
             
event.getAlteredTables().add(database.getSchemas().get(schemaName).get(renameTable));
             event.getDroppedTables().add(tableName);
         }
-        ShardingSphereEventBus.getInstance().post(event);
+        return Optional.of(event);
     }
     
     private void removeTableMetaData(final ShardingSphereDatabase database, 
final FederationDatabaseMetaData federationDatabaseMetaData,
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java
index a9e3f5c8010..4358371ecc7 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java
@@ -22,10 +22,12 @@ import 
org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropDatabaseStatement;
 
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * MetaDataRefresher for testing.
@@ -33,9 +35,12 @@ import java.util.Map;
 public final class DummyDropDatabaseMetaDataRefresher implements 
MetaDataRefresher<DropDatabaseStatement> {
     
     @Override
-    public void refresh(final ShardingSphereDatabase database, final 
FederationDatabaseMetaData federationDatabaseMetaData, final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
-                        final Collection<String> logicDataSourceNames, final 
String schemaName, final DropDatabaseStatement sqlStatement, final 
ConfigurationProperties props) {
+    public Optional<MetaDataRefreshedEvent> refresh(final 
ShardingSphereDatabase database, final FederationDatabaseMetaData 
federationDatabaseMetaData,
+                                                    final Map<String, 
OptimizerPlannerContext> optimizerPlanners,
+                                                    final Collection<String> 
logicDataSourceNames, final String schemaName, final DropDatabaseStatement 
sqlStatement,
+                                                    final 
ConfigurationProperties props) {
         sqlStatement.getDatabaseName();
+        return Optional.empty();
     }
     
     @Override
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
index 6e84a896ee4..59ef48616d9 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
@@ -23,12 +23,12 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.type.dialect.SQL92DatabaseType;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -43,10 +43,12 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.Optional;
 import java.util.Properties;
 
-import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -54,12 +56,13 @@ public final class RenameTableStatementSchemaRefresherTest {
     
     @Test
     public void assertRefresh() throws SQLException {
-        RenameTableLister listener = new RenameTableLister(2);
-        ShardingSphereEventBus.getInstance().register(listener);
-        new 
RenameTableStatementSchemaRefresher().refresh(createDatabaseMetaData(), new 
FederationDatabaseMetaData("foo_database", Collections.emptyMap()),
+        ShardingSphereDatabase actual = createDatabaseMetaData();
+        Optional<MetaDataRefreshedEvent> event = new 
RenameTableStatementSchemaRefresher().refresh(actual, new 
FederationDatabaseMetaData("foo_database", Collections.emptyMap()),
                 new HashMap<>(), Collections.singleton("foo_ds"), 
"foo_schema", createRenameTableStatement(), new ConfigurationProperties(new 
Properties()));
-        assertThat(listener.getActualCount(), is(listener.getRenameCount()));
-        ShardingSphereEventBus.getInstance().unregister(listener);
+        assertTrue(event.isPresent());
+        assertThat(((SchemaAlteredEvent) event.get()).getDatabaseName(), 
is(DefaultDatabase.LOGIC_NAME));
+        assertThat(((SchemaAlteredEvent) event.get()).getSchemaName(), 
is("foo_schema"));
+        assertThat(((SchemaAlteredEvent) event.get()).getDroppedTables(), 
is(Arrays.asList("tbl_0", "tbl_1")));
     }
     
     private RenameTableStatement createRenameTableStatement() {
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
index f77df1a50b6..bc29723a5b3 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
@@ -49,7 +49,7 @@ public final class DriverExecutor implements AutoCloseable {
         MetaDataContexts metaDataContexts = 
connection.getContextManager().getMetaDataContexts();
         ExecutorEngine executorEngine = 
connection.getContextManager().getExecutorEngine();
         JDBCExecutor jdbcExecutor = new JDBCExecutor(executorEngine, 
connection.isHoldTransaction());
-        regularExecutor = new DriverJDBCExecutor(connection.getDatabaseName(), 
metaDataContexts, jdbcExecutor);
+        regularExecutor = new DriverJDBCExecutor(connection.getDatabaseName(), 
connection.getContextManager(), jdbcExecutor);
         rawExecutor = new RawExecutor(executorEngine, 
connection.isHoldTransaction(), metaDataContexts.getMetaData().getProps());
         DatabaseType databaseType = 
metaDataContexts.getMetaData().getDatabases().get(connection.getDatabaseName()).getResource().getDatabaseType();
         String schemaName = 
DatabaseTypeEngine.getDefaultSchemaName(databaseType, 
connection.getDatabaseName());
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java
index 3fceb1a719b..eea7f4e617a 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java
@@ -22,21 +22,25 @@ import 
org.apache.shardingsphere.driver.executor.callback.ExecuteQueryCallback;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefreshEngine;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupContext;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import 
org.apache.shardingsphere.infra.executor.sql.process.ExecuteProcessEngine;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
+import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -48,15 +52,18 @@ public final class DriverJDBCExecutor {
     
     private final MetaDataContexts metaDataContexts;
     
+    private final ContextManager contextManager;
+    
     @Getter
     private final JDBCExecutor jdbcExecutor;
     
     private final MetaDataRefreshEngine metadataRefreshEngine;
     
-    public DriverJDBCExecutor(final String databaseName, final 
MetaDataContexts metaDataContexts, final JDBCExecutor jdbcExecutor) {
+    public DriverJDBCExecutor(final String databaseName, final ContextManager 
contextManager, final JDBCExecutor jdbcExecutor) {
         this.databaseName = databaseName;
-        this.metaDataContexts = metaDataContexts;
+        this.contextManager = contextManager;
         this.jdbcExecutor = jdbcExecutor;
+        metaDataContexts = contextManager.getMetaDataContexts();
         metadataRefreshEngine = new 
MetaDataRefreshEngine(metaDataContexts.getMetaData().getDatabases().get(databaseName),
                 
metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName),
                 metaDataContexts.getOptimizerContext().getPlannerContexts(), 
metaDataContexts.getMetaData().getProps());
@@ -155,7 +162,10 @@ public final class DriverJDBCExecutor {
     }
     
     private void refreshMetaData(final SQLStatementContext<?> 
sqlStatementContext, final Collection<RouteUnit> routeUnits) throws 
SQLException {
-        metadataRefreshEngine.refresh(sqlStatementContext, () -> 
routeUnits.stream()
+        Optional<MetaDataRefreshedEvent> event = 
metadataRefreshEngine.refresh(sqlStatementContext, () -> routeUnits.stream()
                 .map(each -> 
each.getDataSourceMapper().getLogicName()).collect(Collectors.toCollection(() 
-> new ArrayList<>(routeUnits.size()))));
+        if (contextManager.getInstanceContext().isCluster() && 
event.isPresent()) {
+            ShardingSphereEventBus.getInstance().post(event.get());
+        }
     }
 }
diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySu
 [...]
index 09bd2739009..bc6a9326eb8 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
@@ -21,6 +21,7 @@ import com.google.common.eventbus.Subscribe;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.AddSchemaEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.AlterSchemaEvent;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.DropIndexEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.DropSchemaEvent;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.event.SchemaAlteredEvent;
 import 
org.apache.shardingsphere.mode.metadata.persist.service.SchemaMetaDataPersistService;
@@ -79,4 +80,13 @@ public final class SchemaMetaDataRegistrySubscriber {
     public void dropSchema(final DropSchemaEvent event) {
         event.getSchemaNames().forEach(each -> 
persistService.deleteSchema(event.getDatabaseName(), each));
     }
+    
+    /**
+     * Drop index.
+     * @param event drop index event
+     */
+    @Subscribe
+    public void dropIndex(final DropIndexEvent event) {
+        event.getSchemaAlteredEvents().forEach(this::update);
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index c95947b5fc7..70feea1c4b8 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.context.kernel.KernelProcessor;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefreshEngine;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.update.UpdateResult;
@@ -34,6 +35,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriv
 import org.apache.shardingsphere.infra.merge.MergeEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.mode.manager.lock.ShardingSphereLockJudgeEngine;
@@ -104,8 +106,11 @@ public abstract class DatabaseCommunicationEngine<T> {
     public abstract T execute();
     
     protected void refreshMetaData(final ExecutionContext executionContext) 
throws SQLException {
-        
metadataRefreshEngine.refresh(executionContext.getSqlStatementContext(), () -> 
executionContext.getRouteContext().getRouteUnits().stream()
+        Optional<MetaDataRefreshedEvent> event = 
metadataRefreshEngine.refresh(executionContext.getSqlStatementContext(), () -> 
executionContext.getRouteContext().getRouteUnits().stream()
                 .map(each -> 
each.getDataSourceMapper().getLogicName()).collect(Collectors.toList()));
+        if 
(ProxyContext.getInstance().getContextManager().getInstanceContext().isCluster()
 && event.isPresent()) {
+            ShardingSphereEventBus.getInstance().post(event.get());
+        }
     }
     
     protected QueryResponseHeader processExecuteQuery(final ExecutionContext 
executionContext, final List<QueryResult> queryResults, final QueryResult 
queryResultSample) throws SQLException {

Reply via email to