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

zhangyonglun 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 11b49d2  Add ShardingSphereResource (#8033)
11b49d2 is described below

commit 11b49d2df51c6b1606f483dfdb9efa8e8147ed12
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Nov 5 14:05:55 2020 +0800

    Add ShardingSphereResource (#8033)
    
    * Add ShardingSphereResource
    
    * Use ShardingSphereResource.dataSourcesMetaData instead of 
ShardingSphereSchema.dataSourcesMetaData
---
 .../EncryptSQLRewriterParameterizedTest.java       |  7 ++--
 .../route/engine/ReplicaQuerySQLRouterTest.java    | 29 ++++++++++------
 .../shadow/route/engine/ShadowSQLRouterTest.java   | 35 ++++++++++++-------
 .../MixSQLRewriterParameterizedTest.java           | 27 ++++++++-------
 .../ShardingSQLRewriterParameterizedTest.java      | 25 +++++++-------
 .../engine/type/standard/AbstractSQLRouteTest.java | 13 ++++---
 .../context/schema/GovernanceSchemaContexts.java   | 22 ++++++------
 .../schema/GovernanceSchemaContextsTest.java       | 14 ++++----
 .../infra/metadata/ShardingSphereMetaData.java     | 10 +++---
 .../metadata/resource/ShardingSphereResource.java  | 40 ++++++++++++++++++++++
 .../infra/metadata/ShardingSphereMetaDataTest.java | 20 +++++++----
 .../infra/context/kernel/KernelProcessor.java      |  2 +-
 .../context/schema/SchemaContextsBuilder.java      | 39 ++++++++++++---------
 .../context/schema/SchemaContextsBuilderTest.java  |  6 ++--
 .../sql/context/ExecutionContextBuilder.java       | 19 +++++-----
 .../sql/context/ExecutionContextBuilderTest.java   | 14 ++++++--
 .../infra/route/engine/SQLRouteEngineTest.java     | 10 ++++--
 .../core/datasource/ShardingSphereDataSource.java  |  2 +-
 .../GovernanceShardingSphereDataSource.java        |  8 ++---
 .../GovernanceShardingSphereDataSourceTest.java    | 20 +++++------
 .../type/GovernanceSpringBootEncryptTest.java      |  2 +-
 .../GovernanceSpringBootRegistryEncryptTest.java   |  2 +-
 ...vernanceSpringBootRegistryReplicaQueryTest.java |  2 +-
 .../GovernanceSpringBootRegistryShardingTest.java  |  2 +-
 .../type/GovernanceSpringBootReplicaQueryTest.java |  2 +-
 .../type/GovernanceSpringBootShardingTest.java     |  2 +-
 .../GovernanceShardingNamespaceTest.java           |  2 +-
 ...overnanceShardingReplicaQueryNamespaceTest.java |  2 +-
 .../jdbc/JDBCDatabaseCommunicationEngine.java      |  3 +-
 .../jdbc/datasource/JDBCBackendDataSource.java     |  2 +-
 .../proxy/backend/context/ProxyContext.java        |  2 +-
 .../jdbc/datasource/JDBCBackendDataSourceTest.java |  2 +-
 .../proxy/backend/context/ProxyContextTest.java    |  5 +--
 .../ShardingCTLExplainBackendHandlerTest.java      |  9 +++--
 .../impl/AbstractBootstrapInitializer.java         |  2 +-
 35 files changed, 251 insertions(+), 152 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameterized/EncryptSQLRewriterParameterizedTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameterized/EncryptSQLRewriterParameterizedTest.java
index ca67007..50a322d 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameterized/EncryptSQLRewriterParameterizedTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-rewrite/src/test/java/org/apache/shardingsphere/encrypt/rewrite/parameterized/EncryptSQLRewriterParameterizedTest.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
 import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
@@ -75,12 +76,12 @@ public final class EncryptSQLRewriterParameterizedTest 
extends AbstractSQLRewrit
         Collection<ShardingSphereRule> rules = 
ShardingSphereRulesBuilder.build(
                 new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(ruleConfigurations.getRules()),
 ruleConfigurations.getDataSources().keySet());
         SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine(null == getTestParameters().getDatabaseType() ? 
"SQL92" : getTestParameters().getDatabaseType());
-        ShardingSphereSchema schema = createShardingSphereSchema();
+        ShardingSphereSchema schema = buildSchema();
         ConfigurationProperties props = new 
ConfigurationProperties(ruleConfigurations.getProps());
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(schema.getSchemaMetaData(), 
                 getTestParameters().getInputParameters(), 
sqlStatementParserEngine.parse(getTestParameters().getInputSQL(), false));
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("sharding_db", Collections.emptyList(), rules, 
Collections.emptyMap(), schema);
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("sharding_db", Collections.emptyList(), rules, 
mock(ShardingSphereResource.class), schema);
         RouteContext routeContext = new SQLRouteEngine(rules, 
props).route(logicSQL, metaData);
         SQLRewriteResult sqlRewriteResult = new SQLRewriteEntry(
                 schema.getSchemaMetaData(), props, 
rules).rewrite(getTestParameters().getInputSQL(), 
getTestParameters().getInputParameters(), sqlStatementContext, routeContext);
@@ -94,7 +95,7 @@ public final class EncryptSQLRewriterParameterizedTest 
extends AbstractSQLRewrit
         return YamlEngine.unmarshal(new File(url.getFile()), 
YamlRootRuleConfigurations.class);
     }
     
-    private ShardingSphereSchema createShardingSphereSchema() {
+    private ShardingSphereSchema buildSchema() {
         PhysicalSchemaMetaData schemaMetaData = 
mock(PhysicalSchemaMetaData.class);
         
when(schemaMetaData.getAllColumnNames("t_account")).thenReturn(Arrays.asList("account_id",
 "certificate_number", "password", "amount", "status"));
         
when(schemaMetaData.getAllColumnNames("t_account_bak")).thenReturn(Arrays.asList("account_id",
 "certificate_number", "password", "amount", "status"));
diff --git 
a/shardingsphere-features/shardingsphere-replica-query/shardingsphere-replica-query-route/src/test/java/org/apache/shardingsphere/replicaquery/route/engine/ReplicaQuerySQLRouterTest.java
 
b/shardingsphere-features/shardingsphere-replica-query/shardingsphere-replica-query-route/src/test/java/org/apache/shardingsphere/replicaquery/route/engine/ReplicaQuerySQLRouterTest.java
index 4c471ba..307cd7c 100644
--- 
a/shardingsphere-features/shardingsphere-replica-query/shardingsphere-replica-query-route/src/test/java/org/apache/shardingsphere/replicaquery/route/engine/ReplicaQuerySQLRouterTest.java
+++ 
b/shardingsphere-features/shardingsphere-replica-query/shardingsphere-replica-query-route/src/test/java/org/apache/shardingsphere/replicaquery/route/engine/ReplicaQuerySQLRouterTest.java
@@ -17,21 +17,22 @@
 
 package org.apache.shardingsphere.replicaquery.route.engine;
 
+import org.apache.shardingsphere.infra.binder.LogicSQL;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
-import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.route.SQLRouter;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.ordered.OrderedSPIRegistry;
-import org.apache.shardingsphere.infra.binder.LogicSQL;
 import 
org.apache.shardingsphere.replicaquery.api.config.ReplicaQueryRuleConfiguration;
 import 
org.apache.shardingsphere.replicaquery.api.config.rule.ReplicaQueryDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.replicaquery.route.engine.impl.PrimaryVisitedManager;
 import org.apache.shardingsphere.replicaquery.rule.ReplicaQueryRule;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.LockSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
@@ -50,6 +51,7 @@ import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -90,7 +92,8 @@ public final class ReplicaQuerySQLRouterTest {
     @Test
     public void assertCreateRouteContextToPrimaryWithoutRouteUnits() {
         LogicSQL logicSQL = new LogicSQL(mock(SQLStatementContext.class), "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, 
rule, new ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
@@ -100,7 +103,8 @@ public final class ReplicaQuerySQLRouterTest {
     public void assertDecorateRouteContextToPrimaryDataSource() {
         RouteContext actual = mockRouteContext();
         LogicSQL logicSQL = new LogicSQL(mock(SQLStatementContext.class), "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new 
ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), 
is(NONE_REPLICA_QUERY_DATASOURCE_NAME));
@@ -113,7 +117,8 @@ public final class ReplicaQuerySQLRouterTest {
         
when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
         when(selectStatement.getLock()).thenReturn(Optional.empty());
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, 
rule, new ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), is(REPLICA_DATASOURCE));
@@ -126,7 +131,8 @@ public final class ReplicaQuerySQLRouterTest {
         
when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
         when(selectStatement.getLock()).thenReturn(Optional.empty());
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new 
ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), 
is(NONE_REPLICA_QUERY_DATASOURCE_NAME));
@@ -139,7 +145,8 @@ public final class ReplicaQuerySQLRouterTest {
         
when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
         
when(selectStatement.getLock()).thenReturn(Optional.of(mock(LockSegment.class)));
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, 
rule, new ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
@@ -152,7 +159,8 @@ public final class ReplicaQuerySQLRouterTest {
         
when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
         
when(selectStatement.getLock()).thenReturn(Optional.of(mock(LockSegment.class)));
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new 
ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), 
is(NONE_REPLICA_QUERY_DATASOURCE_NAME));
@@ -163,7 +171,8 @@ public final class ReplicaQuerySQLRouterTest {
     public void assertCreateRouteContextToPrimaryDataSource() {
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(InsertStatement.class));
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, 
rule, new ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), is(PRIMARY_DATASOURCE));
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowSQLRouterTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowSQLRouterTest.java
index baf9ae3..06cd628 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowSQLRouterTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-route/src/test/java/org/apache/shardingsphere/shadow/route/engine/ShadowSQLRouterTest.java
@@ -17,21 +17,22 @@
 
 package org.apache.shardingsphere.shadow.route.engine;
 
+import org.apache.shardingsphere.infra.binder.LogicSQL;
+import 
org.apache.shardingsphere.infra.binder.segment.insert.values.InsertValueContext;
+import 
org.apache.shardingsphere.infra.binder.statement.ddl.CreateTableStatementContext;
+import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
-import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.route.SQLRouter;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.ordered.OrderedSPIRegistry;
-import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
-import 
org.apache.shardingsphere.infra.binder.segment.insert.values.InsertValueContext;
-import 
org.apache.shardingsphere.infra.binder.statement.ddl.CreateTableStatementContext;
-import 
org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl.MySQLCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLInsertStatement;
 import org.junit.Before;
@@ -47,6 +48,7 @@ import java.util.Properties;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -77,7 +79,8 @@ public final class ShadowSQLRouterTest {
     @Test
     public void assertCreateRouteContextToShadowDataSource() {
         LogicSQL logicSQL = new LogicSQL(mockSQLStatementContextForShadow(), 
"", Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, 
rule, new ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), is(SHADOW_DATASOURCE));
@@ -86,7 +89,8 @@ public final class ShadowSQLRouterTest {
     @Test
     public void assertCreateRouteContextToActualDataSource() {
         LogicSQL logicSQL = new LogicSQL(mockSQLStatementContext(), "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, 
rule, new ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), is(ACTUAL_DATASOURCE));
@@ -95,7 +99,8 @@ public final class ShadowSQLRouterTest {
     @Test
     public void assertCreateRouteContextForNonDMLStatement() {
         LogicSQL logicSQL = new LogicSQL(mockNonDMLSQLStatementContext(), "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         RouteContext actual = sqlRouter.createRouteContext(logicSQL, metaData, 
rule, new ConfigurationProperties(new Properties()));
         assertThat(actual.getRouteUnits().size(), is(2));
         
assertTrue(actual.getActualDataSourceNames().contains(SHADOW_DATASOURCE));
@@ -107,7 +112,8 @@ public final class ShadowSQLRouterTest {
         RouteContext actual = new RouteContext();
         actual.getRouteUnits().add(mockRouteUnit());
         LogicSQL logicSQL = new LogicSQL(mockSQLStatementContextForShadow(), 
"", Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new 
ConfigurationProperties(new Properties()));
         assertThat(actual.getRouteUnits().size(), is(1));
         
assertTrue(actual.getActualDataSourceNames().contains(SHADOW_DATASOURCE));
@@ -118,7 +124,8 @@ public final class ShadowSQLRouterTest {
         RouteContext actual = new RouteContext();
         actual.getRouteUnits().add(mockRouteUnit());
         LogicSQL logicSQL = new LogicSQL(mockSQLStatementContext(), "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new 
ConfigurationProperties(new Properties()));
         Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
         assertThat(routedDataSourceNames.next(), is(ACTUAL_DATASOURCE));
@@ -129,7 +136,8 @@ public final class ShadowSQLRouterTest {
         RouteContext actual = new RouteContext();
         actual.getRouteUnits().add(mockRouteUnit());
         LogicSQL logicSQL = new LogicSQL(mockNonDMLSQLStatementContext(), "", 
Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new 
ConfigurationProperties(new Properties()));
         assertThat(actual.getRouteUnits().size(), is(2));
         
assertTrue(actual.getActualDataSourceNames().contains(SHADOW_DATASOURCE));
@@ -141,7 +149,8 @@ public final class ShadowSQLRouterTest {
         RouteContext actual = new RouteContext();
         actual.getRouteUnits().add(mockRouteUnit());
         LogicSQL logicSQL = new LogicSQL(mockSQLStatementContextForShadow(), 
"", Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(rule), Collections.emptyMap(), 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(rule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), mock(ShardingSphereSchema.class));
         sqlRouter.decorateRouteContext(actual, logicSQL, metaData, rule, new 
ConfigurationProperties(new Properties()));
         assertThat(actual.getRouteUnits().size(), is(1));
         
assertTrue(actual.getActualDataSourceNames().contains(SHADOW_DATASOURCE));
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/MixSQLRewriterParameterizedTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/MixSQLRewriterParameterizedTest.java
index b5827d0..9f453b2 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/MixSQLRewriterParameterizedTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/MixSQLRewriterParameterizedTest.java
@@ -22,14 +22,8 @@ import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
-import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.column.PhysicalColumnMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.index.PhysicalIndexMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.table.PhysicalTableMetaData;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
 import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
 import 
org.apache.shardingsphere.infra.rewrite.engine.result.GenericSQLRewriteResult;
@@ -43,7 +37,14 @@ import 
org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRulesBuilder;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.column.PhysicalColumnMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.index.PhysicalIndexMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.table.PhysicalTableMetaData;
 import org.apache.shardingsphere.infra.yaml.config.YamlRootRuleConfigurations;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
@@ -82,12 +83,12 @@ public final class MixSQLRewriterParameterizedTest extends 
AbstractSQLRewriterPa
         Collection<ShardingSphereRule> rules = 
ShardingSphereRulesBuilder.build(
                 new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(ruleConfigurations.getRules()),
 ruleConfigurations.getDataSources().keySet());
         SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine(null == getTestParameters().getDatabaseType() ? 
"SQL92" : getTestParameters().getDatabaseType());
-        ShardingSphereSchema schema = createShardingSphereSchema();
+        ShardingSphereSchema schema = buildSchema();
         ConfigurationProperties props = new 
ConfigurationProperties(ruleConfigurations.getProps());
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(schema.getSchemaMetaData(),
                 getTestParameters().getInputParameters(), 
sqlStatementParserEngine.parse(getTestParameters().getInputSQL(), false));
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("sharding_db", Collections.emptyList(), rules, 
Collections.emptyMap(), schema);
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("sharding_db", Collections.emptyList(), rules, 
mock(ShardingSphereResource.class), schema);
         RouteContext routeContext = new SQLRouteEngine(rules, 
props).route(logicSQL, metaData);
         SQLRewriteResult sqlRewriteResult = new SQLRewriteEntry(
                 schema.getSchemaMetaData(), props, 
rules).rewrite(getTestParameters().getInputSQL(), 
getTestParameters().getInputParameters(), sqlStatementContext, routeContext);
@@ -101,7 +102,7 @@ public final class MixSQLRewriterParameterizedTest extends 
AbstractSQLRewriterPa
         return YamlEngine.unmarshal(new File(url.getFile()), 
YamlRootRuleConfigurations.class);
     }
     
-    private ShardingSphereSchema createShardingSphereSchema() {
+    private ShardingSphereSchema buildSchema() {
         PhysicalSchemaMetaData schemaMetaData = 
mock(PhysicalSchemaMetaData.class);
         
when(schemaMetaData.getAllTableNames()).thenReturn(Arrays.asList("t_account", 
"t_account_bak", "t_account_detail"));
         PhysicalTableMetaData accountTableMetaData = 
mock(PhysicalTableMetaData.class);
@@ -122,7 +123,7 @@ public final class MixSQLRewriterParameterizedTest extends 
AbstractSQLRewriterPa
     }
     
     private Map<String, PhysicalColumnMetaData> createColumnMetaDataMap() {
-        Map<String, PhysicalColumnMetaData> result = new LinkedHashMap<>();
+        Map<String, PhysicalColumnMetaData> result = new LinkedHashMap<>(4, 1);
         result.put("account_id", new PhysicalColumnMetaData("account_id", 
Types.INTEGER, "INT", true, true, false));
         result.put("password", mock(PhysicalColumnMetaData.class));
         result.put("amount", mock(PhysicalColumnMetaData.class));
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/ShardingSQLRewriterParameterizedTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/ShardingSQLRewriterParameterizedTest.java
index 38b04e7..64a5b1a 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/ShardingSQLRewriterParameterizedTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/ShardingSQLRewriterParameterizedTest.java
@@ -22,14 +22,8 @@ import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
-import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.column.PhysicalColumnMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.index.PhysicalIndexMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.table.PhysicalTableMetaData;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
 import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
 import 
org.apache.shardingsphere.infra.rewrite.engine.result.GenericSQLRewriteResult;
@@ -43,7 +37,14 @@ import 
org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRulesBuilder;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.column.PhysicalColumnMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.index.PhysicalIndexMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.table.PhysicalTableMetaData;
 import org.apache.shardingsphere.infra.yaml.config.YamlRootRuleConfigurations;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
@@ -82,12 +83,12 @@ public final class ShardingSQLRewriterParameterizedTest 
extends AbstractSQLRewri
         Collection<ShardingSphereRule> rules = 
ShardingSphereRulesBuilder.build(
                 new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(yamlRootRuleConfigs.getRules()),
 yamlRootRuleConfigs.getDataSources().keySet());
         SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine(null == getTestParameters().getDatabaseType() ? 
"SQL92" : getTestParameters().getDatabaseType());
-        ShardingSphereSchema schema = createShardingSphereMetaData();
+        ShardingSphereSchema schema = buildMetaData();
         ConfigurationProperties props = new 
ConfigurationProperties(yamlRootRuleConfigs.getProps());
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(schema.getSchemaMetaData(), 
                 getTestParameters().getInputParameters(), 
sqlStatementParserEngine.parse(getTestParameters().getInputSQL(), false));
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
getTestParameters().getInputSQL(), getTestParameters().getInputParameters());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("sharding_db", Collections.emptyList(), rules, 
Collections.emptyMap(), schema);
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("sharding_db", Collections.emptyList(), rules, 
mock(ShardingSphereResource.class), schema);
         RouteContext routeContext = new SQLRouteEngine(rules, 
props).route(logicSQL, metaData);
         SQLRewriteResult sqlRewriteResult = new 
SQLRewriteEntry(schema.getSchemaMetaData(),
                 props, rules).rewrite(getTestParameters().getInputSQL(), 
getTestParameters().getInputParameters(), sqlStatementContext, routeContext);
@@ -101,7 +102,7 @@ public final class ShardingSQLRewriterParameterizedTest 
extends AbstractSQLRewri
         return YamlEngine.unmarshal(new File(url.getFile()), 
YamlRootRuleConfigurations.class);
     }
     
-    private ShardingSphereSchema createShardingSphereMetaData() {
+    private ShardingSphereSchema buildMetaData() {
         PhysicalSchemaMetaData schemaMetaData = 
mock(PhysicalSchemaMetaData.class);
         
when(schemaMetaData.getAllTableNames()).thenReturn(Arrays.asList("t_account", 
"t_account_detail"));
         PhysicalTableMetaData accountTableMetaData = 
mock(PhysicalTableMetaData.class);
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
index 313418a..7dd2628 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
@@ -23,6 +23,11 @@ import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.config.DatabaseAccessConfiguration;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
+import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
+import org.apache.shardingsphere.infra.route.context.RouteContext;
+import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
 import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
@@ -30,10 +35,6 @@ import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaDa
 import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.column.PhysicalColumnMetaData;
 import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
 import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.table.PhysicalTableMetaData;
-import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.sharding.route.engine.fixture.AbstractRoutingEngineTest;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 
@@ -47,6 +48,7 @@ import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 
 public abstract class AbstractSQLRouteTest extends AbstractRoutingEngineTest {
@@ -60,7 +62,8 @@ public abstract class AbstractSQLRouteTest extends 
AbstractRoutingEngineTest {
         SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine("MySQL");
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(schema.getSchemaMetaData(), parameters, 
sqlStatementParserEngine.parse(sql, false));
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, sql, parameters);
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("sharding_db", Collections.emptyList(), 
Collections.singleton(shardingRule), Collections.emptyMap(), schema);
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "sharding_db", Collections.emptyList(), 
Collections.singleton(shardingRule), mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS), schema);
         RouteContext result = new 
SQLRouteEngine(Collections.singletonList(shardingRule), props).route(logicSQL, 
metaData);
         assertThat(result.getRouteUnits().size(), is(1));
         return result;
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/main/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContexts.java
 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/main/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContexts.java
index d72c5e0..041cfdd 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/main/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContexts.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/main/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContexts.java
@@ -43,12 +43,12 @@ import 
org.apache.shardingsphere.infra.context.schema.impl.StandardSchemaContext
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorKernel;
-import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.StatusContainedRule;
 import 
org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEvent;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
 
 import javax.sql.DataSource;
 import java.io.IOException;
@@ -162,7 +162,7 @@ public final class GovernanceSchemaContexts implements 
SchemaContexts {
         schemaContexts = new StandardSchemaContexts(metaDataMap, 
schemaContexts.getExecutorKernel(), schemaContexts.getAuthentication(), 
schemaContexts.getProps(), schemaContexts.getDatabaseType());
         
governanceFacade.getConfigCenter().persistMetaData(event.getSchemaName(), 
schemaContexts.getMetaDataMap().get(event.getSchemaName()).getSchema().getSchemaMetaData());
         GovernanceEventBus.getInstance().post(
-                new DataSourceChangeCompletedEvent(event.getSchemaName(), 
schemaContexts.getDatabaseType(), 
metaDataMap.get(event.getSchemaName()).getDataSources()));
+                new DataSourceChangeCompletedEvent(event.getSchemaName(), 
schemaContexts.getDatabaseType(), 
metaDataMap.get(event.getSchemaName()).getResource().getDataSources()));
     }
     
     /**
@@ -250,7 +250,7 @@ public final class GovernanceSchemaContexts implements 
SchemaContexts {
         schemaContexts = new StandardSchemaContexts(
                 newMetaDataMap, schemaContexts.getExecutorKernel(), 
schemaContexts.getAuthentication(), schemaContexts.getProps(), 
schemaContexts.getDatabaseType());
         GovernanceEventBus.getInstance().post(
-                new DataSourceChangeCompletedEvent(event.getSchemaName(), 
schemaContexts.getDatabaseType(), 
newMetaDataMap.get(event.getSchemaName()).getDataSources()));
+                new DataSourceChangeCompletedEvent(event.getSchemaName(), 
schemaContexts.getDatabaseType(), 
newMetaDataMap.get(event.getSchemaName()).getResource().getDataSources()));
     }
     
     /**
@@ -302,11 +302,11 @@ public final class GovernanceSchemaContexts implements 
SchemaContexts {
         // TODO refresh tableAddressingMetaData
         ShardingSphereSchema schema = new ShardingSphereSchema(
                 oldMetaData.getSchema().getDataSourcesMetaData(), 
oldMetaData.getSchema().getTableAddressingMetaData(), newSchemaMetaData, 
oldMetaData.getSchema().getCachedDatabaseMetaData());
-        return new ShardingSphereMetaData(schemaName, 
oldMetaData.getConfigurations(), oldMetaData.getRules(), 
oldMetaData.getDataSources(), schema);
+        return new ShardingSphereMetaData(schemaName, 
oldMetaData.getConfigurations(), oldMetaData.getRules(), 
oldMetaData.getResource(), schema);
     }
     
     private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData oldMetaData, final Collection<RuleConfiguration> 
ruleConfigs) throws SQLException {
-        SchemaContextsBuilder builder = new 
SchemaContextsBuilder(schemaContexts.getDatabaseType(), 
Collections.singletonMap(oldMetaData.getName(), oldMetaData.getDataSources()),
+        SchemaContextsBuilder builder = new 
SchemaContextsBuilder(schemaContexts.getDatabaseType(), 
Collections.singletonMap(oldMetaData.getName(), 
oldMetaData.getResource().getDataSources()),
                 Collections.singletonMap(oldMetaData.getName(), ruleConfigs), 
schemaContexts.getAuthentication(), schemaContexts.getProps().getProps());
         return builder.build().getMetaDataMap().values().iterator().next();
     }
@@ -317,7 +317,7 @@ public final class GovernanceSchemaContexts implements 
SchemaContexts {
         oldMetaData.closeDataSources(deletedDataSources);
         oldMetaData.closeDataSources(modifiedDataSources.keySet());
         Map<String, Map<String, DataSource>> dataSourcesMap = 
Collections.singletonMap(oldMetaData.getName(), 
-                getNewDataSources(oldMetaData.getDataSources(), 
getAddedDataSources(oldMetaData, newDataSourceConfigs), modifiedDataSources, 
deletedDataSources));
+                getNewDataSources(oldMetaData.getResource().getDataSources(), 
getAddedDataSources(oldMetaData, newDataSourceConfigs), modifiedDataSources, 
deletedDataSources));
         return new SchemaContextsBuilder(schemaContexts.getDatabaseType(), 
dataSourcesMap,
                 Collections.singletonMap(oldMetaData.getName(), 
oldMetaData.getConfigurations()), schemaContexts.getAuthentication(), 
                 
schemaContexts.getProps().getProps()).build().getMetaDataMap().get(oldMetaData.getName());
@@ -334,18 +334,18 @@ public final class GovernanceSchemaContexts implements 
SchemaContexts {
     }
     
     private Collection<String> getDeletedDataSources(final 
ShardingSphereMetaData oldMetaData, final Map<String, DataSourceConfiguration> 
newDataSourceConfigs) {
-        Collection<String> result = new 
LinkedList<>(oldMetaData.getDataSources().keySet());
+        Collection<String> result = new 
LinkedList<>(oldMetaData.getResource().getDataSources().keySet());
         result.removeAll(newDataSourceConfigs.keySet());
         return result;
     }
     
     private Map<String, DataSource> getAddedDataSources(final 
ShardingSphereMetaData oldMetaData, final Map<String, DataSourceConfiguration> 
newDataSourceConfigs) {
-        return 
DataSourceConverter.getDataSourceMap(Maps.filterKeys(newDataSourceConfigs, each 
-> !oldMetaData.getDataSources().containsKey(each)));
+        return 
DataSourceConverter.getDataSourceMap(Maps.filterKeys(newDataSourceConfigs, each 
-> !oldMetaData.getResource().getDataSources().containsKey(each)));
     }
     
     private Map<String, DataSource> getModifiedDataSources(final 
ShardingSphereMetaData oldMetaData, final Map<String, DataSourceConfiguration> 
newDataSourceConfigs) {
         Map<String, DataSourceConfiguration> modifiedDataSourceConfigs = 
newDataSourceConfigs.entrySet().stream()
-                .filter(entry -> 
isModifiedDataSource(oldMetaData.getDataSources(), entry.getKey(), 
entry.getValue()))
+                .filter(entry -> 
isModifiedDataSource(oldMetaData.getResource().getDataSources(), 
entry.getKey(), entry.getValue()))
                 .collect(Collectors.toMap(Map.Entry::getKey, 
Map.Entry::getValue, (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
         return DataSourceConverter.getDataSourceMap(modifiedDataSourceConfigs);
     }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/test/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContextsTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/test/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContextsTest.java
index 26d5234..351a45d 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/test/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContextsTest.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-context/src/test/java/org/apache/shardingsphere/governance/context/schema/GovernanceSchemaContextsTest.java
@@ -38,10 +38,11 @@ import 
org.apache.shardingsphere.infra.context.schema.impl.StandardSchemaContext
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorKernel;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
+import org.apache.shardingsphere.infra.rule.event.RuleChangedEvent;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
-import org.apache.shardingsphere.infra.rule.event.RuleChangedEvent;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.jdbc.test.MockedDataSource;
 import org.apache.shardingsphere.replicaquery.rule.ReplicaQueryRule;
 import org.junit.Before;
@@ -105,11 +106,12 @@ public final class GovernanceSchemaContextsTest {
         when(governanceFacade.getRegistryCenter()).thenReturn(registryCenter);
         when(governanceFacade.getConfigCenter()).thenReturn(configCenter);
         
when(registryCenter.loadDisabledDataSources("schema")).thenReturn(Collections.singletonList("schema.ds_1"));
-        governanceSchemaContexts = new GovernanceSchemaContexts(new 
StandardSchemaContexts(createSchemas(), mock(ExecutorKernel.class), 
authentication, props, databaseType), governanceFacade);
+        governanceSchemaContexts = new GovernanceSchemaContexts(new 
StandardSchemaContexts(createMetaDataMap(), mock(ExecutorKernel.class), 
authentication, props, databaseType), governanceFacade);
     }
     
-    private Map<String, ShardingSphereMetaData> createSchemas() {
+    private Map<String, ShardingSphereMetaData> createMetaDataMap() {
         when(metaData.getName()).thenReturn("schema");
+        
when(metaData.getResource()).thenReturn(mock(ShardingSphereResource.class));
         
when(metaData.getSchema()).thenReturn(mock(ShardingSphereSchema.class));
         
when(metaData.getRules()).thenReturn(Collections.singletonList(replicaQueryRule));
         return Collections.singletonMap("schema", metaData);
@@ -151,7 +153,7 @@ public final class GovernanceSchemaContextsTest {
         
when(configCenter.loadDataSourceConfigurations("schema_add")).thenReturn(getDataSourceConfigurations());
         governanceSchemaContexts.renew(event);
         
assertNotNull(governanceSchemaContexts.getMetaDataMap().get("schema_add"));
-        
assertNotNull(governanceSchemaContexts.getMetaDataMap().get("schema_add").getDataSources());
+        
assertNotNull(governanceSchemaContexts.getMetaDataMap().get("schema_add").getResource().getDataSources());
     }
     
     private Map<String, DataSourceConfiguration> getDataSourceConfigurations() 
{
@@ -221,7 +223,7 @@ public final class GovernanceSchemaContextsTest {
     public void assertDataSourceChanged() throws SQLException {
         DataSourceChangedEvent event = new DataSourceChangedEvent("schema", 
getChangedDataSourceConfigurations());
         governanceSchemaContexts.renew(event);
-        
assertTrue(governanceSchemaContexts.getMetaDataMap().get("schema").getDataSources().containsKey("ds_2"));
+        
assertTrue(governanceSchemaContexts.getMetaDataMap().get("schema").getResource().getDataSources().containsKey("ds_2"));
     }
     
     private Map<String, DataSourceConfiguration> 
getChangedDataSourceConfigurations() {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
index 5eedba1..a065517 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
@@ -20,13 +20,13 @@ package org.apache.shardingsphere.infra.metadata;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * ShardingSphere meta data.
@@ -41,7 +41,7 @@ public final class ShardingSphereMetaData {
     
     private final Collection<ShardingSphereRule> rules;
     
-    private final Map<String, DataSource> dataSources;
+    private final ShardingSphereResource resource;
     
     private final ShardingSphereSchema schema;
     
@@ -51,7 +51,7 @@ public final class ShardingSphereMetaData {
      * @return is complete schema context or not
      */
     public boolean isComplete() {
-        return !rules.isEmpty() && !dataSources.isEmpty();
+        return !rules.isEmpty() && !resource.getDataSources().isEmpty();
     }
     
     /**
@@ -61,7 +61,7 @@ public final class ShardingSphereMetaData {
      */
     public void closeDataSources(final Collection<String> dataSources) throws 
SQLException {
         for (String each :dataSources) {
-            close(this.dataSources.get(each));
+            close(resource.getDataSources().get(each));
         }
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/resource/ShardingSphereResource.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/resource/ShardingSphereResource.java
new file mode 100644
index 0000000..472ddd6
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/resource/ShardingSphereResource.java
@@ -0,0 +1,40 @@
+/*
+ * 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.infra.metadata.resource;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
+
+import javax.sql.DataSource;
+import java.util.Map;
+
+/**
+ * ShardingSphere resource.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class ShardingSphereResource {
+    
+    private final Map<String, DataSource> dataSources;
+    
+    private final DataSourcesMetaData dataSourcesMetaData;
+    
+    private final CachedDatabaseMetaData cachedDatabaseMetaData;
+}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
index 8790843..0189541 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaDataTest.java
@@ -18,9 +18,12 @@
 package org.apache.shardingsphere.infra.metadata;
 
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.schema.fixture.datasource.CloseableDataSource;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -54,28 +57,31 @@ public final class ShardingSphereMetaDataTest {
     
     @Test
     public void assertIsComplete() {
-        ShardingSphereMetaData metaData = new ShardingSphereMetaData("name", 
Collections.singleton(mock(RuleConfiguration.class)),
-                Collections.singleton(mock(ShardingSphereRule.class)), 
Collections.singletonMap("ds", mock(DataSource.class)), 
mock(ShardingSphereSchema.class));
+        ShardingSphereResource resource = new 
ShardingSphereResource(Collections.singletonMap("ds", mock(DataSource.class)), 
mock(DataSourcesMetaData.class), mock(CachedDatabaseMetaData.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "name", Collections.singleton(mock(RuleConfiguration.class)), 
Collections.singleton(mock(ShardingSphereRule.class)), resource, 
mock(ShardingSphereSchema.class));
         assertTrue(metaData.isComplete());
     }
     
     @Test
     public void assertIsNotCompleteWithoutRule() {
-        ShardingSphereMetaData metaData = new ShardingSphereMetaData("name", 
Collections.emptyList(),
-                Collections.emptyList(), Collections.singletonMap("ds", 
mock(DataSource.class)), mock(ShardingSphereSchema.class));
+        ShardingSphereResource resource = new 
ShardingSphereResource(Collections.singletonMap("ds", mock(DataSource.class)), 
mock(DataSourcesMetaData.class), mock(CachedDatabaseMetaData.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData("name", 
Collections.emptyList(), Collections.emptyList(), resource, 
mock(ShardingSphereSchema.class));
         assertFalse(metaData.isComplete());
     }
     
     @Test
     public void assertIsNotCompleteWithoutDataSource() {
-        ShardingSphereMetaData metaData = new ShardingSphereMetaData("name", 
Collections.singleton(mock(RuleConfiguration.class)),
-                Collections.singleton(mock(ShardingSphereRule.class)), 
Collections.emptyMap(), mock(ShardingSphereSchema.class));
+        ShardingSphereResource resource = new 
ShardingSphereResource(Collections.emptyMap(), mock(DataSourcesMetaData.class), 
mock(CachedDatabaseMetaData.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "name", Collections.singleton(mock(RuleConfiguration.class)), 
Collections.singleton(mock(ShardingSphereRule.class)), resource, 
mock(ShardingSphereSchema.class));
         assertFalse(metaData.isComplete());
     }
     
     @Test
     public void assertCloseDataSources() throws SQLException, IOException {
-        new ShardingSphereMetaData("name", Collections.emptyList(), 
Collections.emptyList(), createDataSources(), 
mock(ShardingSphereSchema.class)).closeDataSources(Arrays.asList("ds_0", 
"ds_2"));
+        ShardingSphereResource resource = new 
ShardingSphereResource(createDataSources(), mock(DataSourcesMetaData.class), 
mock(CachedDatabaseMetaData.class));
+        new ShardingSphereMetaData("name", Collections.emptyList(), 
Collections.emptyList(), resource, 
mock(ShardingSphereSchema.class)).closeDataSources(Arrays.asList("ds_0", 
"ds_2"));
         verify(dataSource0).close();
         verify(dataSource1, times(0)).close();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java
index ad0d104..f12fd2e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java
@@ -52,7 +52,7 @@ public final class KernelProcessor {
         RouteContext routeContext = sqlRouteEngine.route(logicSQL, metaData);
         SQLRewriteEntry rewriteEntry = new 
SQLRewriteEntry(metaData.getSchema().getSchemaMetaData(), props, rules);
         SQLRewriteResult rewriteResult = 
rewriteEntry.rewrite(logicSQL.getSql(), logicSQL.getParameters(), 
sqlStatementContext, routeContext);
-        Collection<ExecutionUnit> executionUnits = 
ExecutionContextBuilder.build(metaData.getSchema(), rewriteResult, 
sqlStatementContext);
+        Collection<ExecutionUnit> executionUnits = 
ExecutionContextBuilder.build(metaData, rewriteResult, sqlStatementContext);
         return new ExecutionContext(sqlStatementContext, executionUnits, 
routeContext);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilder.java
index 9b83957..aa41eb5 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilder.java
@@ -26,6 +26,10 @@ import 
org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKe
 import 
org.apache.shardingsphere.infra.context.schema.impl.StandardSchemaContexts;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorKernel;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRulesBuilder;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
 import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaDataLoader;
@@ -33,9 +37,6 @@ import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMet
 import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
 import 
org.apache.shardingsphere.infra.schema.model.schema.SchemaMetaDataLoader;
 import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.schema.PhysicalSchemaMetaData;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRulesBuilder;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 
 import javax.sql.DataSource;
 import java.sql.Connection;
@@ -90,27 +91,22 @@ public final class SchemaContextsBuilder {
     public SchemaContexts build() throws SQLException {
         Map<String, ShardingSphereMetaData> mataDataMap = new 
LinkedHashMap<>(ruleConfigs.size(), 1);
         for (String each : ruleConfigs.keySet()) {
-            mataDataMap.put(each, createMetaData(each));
+            mataDataMap.put(each, buildMetaData(each));
         }
         return new StandardSchemaContexts(mataDataMap, executorKernel, 
authentication, props, databaseType);
     }
     
-    private ShardingSphereMetaData createMetaData(final String schemaName) 
throws SQLException {
-        Map<String, DataSource> dataSources = this.dataSources.get(schemaName);
+    private ShardingSphereMetaData buildMetaData(final String schemaName) 
throws SQLException {
+        Map<String, DataSource> dataSourceMap = dataSources.get(schemaName);
         Collection<RuleConfiguration> ruleConfigs = 
this.ruleConfigs.get(schemaName);
-        Collection<ShardingSphereRule> rules = 
ShardingSphereRulesBuilder.build(ruleConfigs, dataSources.keySet());
-        return new ShardingSphereMetaData(schemaName, ruleConfigs, rules, 
dataSources, createMetaData(schemaName, dataSources, rules));
+        Collection<ShardingSphereRule> rules = 
ShardingSphereRulesBuilder.build(ruleConfigs, dataSourceMap.keySet());
+        return new ShardingSphereMetaData(schemaName, ruleConfigs, rules, 
buildResource(dataSourceMap), buildSchema(schemaName, dataSourceMap, rules));
     }
     
-    private ShardingSphereSchema createMetaData(final String schemaName, final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
rules) throws SQLException {
-        long start = System.currentTimeMillis();
+    private ShardingSphereResource buildResource(final Map<String, DataSource> 
dataSourceMap) throws SQLException {
         DataSourcesMetaData dataSourceMetas = new 
DataSourcesMetaData(databaseType, 
getDatabaseAccessConfigurationMap(dataSourceMap));
-        TableAddressingMetaData tableAddressingMetaData = 
TableAddressingMetaDataLoader.load(databaseType, dataSourceMap, rules);
-        PhysicalSchemaMetaData physicalSchemaMetaData = new 
SchemaMetaDataLoader(rules).load(databaseType, dataSourceMap, props);
-        CachedDatabaseMetaData cachedDatabaseMetaData = 
createCachedDatabaseMetaData(dataSources.get(schemaName)).orElse(null);
-        ShardingSphereSchema result = new 
ShardingSphereSchema(dataSourceMetas, tableAddressingMetaData, 
physicalSchemaMetaData, cachedDatabaseMetaData);
-        log.info("Load meta data for schema {} finished, cost {} 
milliseconds.", schemaName, System.currentTimeMillis() - start);
-        return result;
+        CachedDatabaseMetaData cachedDatabaseMetaData = 
createCachedDatabaseMetaData(dataSourceMap).orElse(null);
+        return new ShardingSphereResource(dataSourceMap, dataSourceMetas, 
cachedDatabaseMetaData);
     }
     
     private Map<String, DatabaseAccessConfiguration> 
getDatabaseAccessConfigurationMap(final Map<String, DataSource> dataSourceMap) 
throws SQLException {
@@ -133,4 +129,15 @@ public final class SchemaContextsBuilder {
             return Optional.of(new 
CachedDatabaseMetaData(connection.getMetaData()));
         }
     }
+    
+    private ShardingSphereSchema buildSchema(final String schemaName, final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
rules) throws SQLException {
+        long start = System.currentTimeMillis();
+        DataSourcesMetaData dataSourceMetas = new 
DataSourcesMetaData(databaseType, 
getDatabaseAccessConfigurationMap(dataSourceMap));
+        TableAddressingMetaData tableAddressingMetaData = 
TableAddressingMetaDataLoader.load(databaseType, dataSourceMap, rules);
+        PhysicalSchemaMetaData physicalSchemaMetaData = new 
SchemaMetaDataLoader(rules).load(databaseType, dataSourceMap, props);
+        CachedDatabaseMetaData cachedDatabaseMetaData = 
createCachedDatabaseMetaData(dataSourceMap).orElse(null);
+        ShardingSphereSchema result = new 
ShardingSphereSchema(dataSourceMetas, tableAddressingMetaData, 
physicalSchemaMetaData, cachedDatabaseMetaData);
+        log.info("Load meta data for schema {} finished, cost {} 
milliseconds.", schemaName, System.currentTimeMillis() - start);
+        return result;
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilderTest.java
index ccc7060..da2a35e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/schema/SchemaContextsBuilderTest.java
@@ -59,7 +59,7 @@ public final class SchemaContextsBuilderTest {
                 Collections.singletonMap("logic_db", Collections.singleton(new 
FixtureRuleConfiguration())), props).build();
         assertThat(actual.getDatabaseType(), CoreMatchers.is(databaseType));
         assertRules(actual);
-        
assertTrue(actual.getMetaDataMap().get("logic_db").getDataSources().isEmpty());
+        
assertTrue(actual.getMetaDataMap().get("logic_db").getResource().getDataSources().isEmpty());
         assertTrue(actual.getAuthentication().getUsers().isEmpty());
         assertThat(actual.getProps().getProps().size(), CoreMatchers.is(1));
         
assertThat(actual.getProps().getValue(ConfigurationPropertyKey.EXECUTOR_SIZE), 
CoreMatchers.is(1));
@@ -88,7 +88,7 @@ public final class SchemaContextsBuilderTest {
     }
     
     private void assertDataSources(final SchemaContexts actual) {
-        
assertThat(actual.getMetaDataMap().get("logic_db").getDataSources().size(), 
CoreMatchers.is(1));
-        
assertThat(actual.getMetaDataMap().get("logic_db").getDataSources().get("ds"), 
CoreMatchers.instanceOf(MockedDataSource.class));
+        
assertThat(actual.getMetaDataMap().get("logic_db").getResource().getDataSources().size(),
 CoreMatchers.is(1));
+        
assertThat(actual.getMetaDataMap().get("logic_db").getResource().getDataSources().get("ds"),
 CoreMatchers.instanceOf(MockedDataSource.class));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
index c581bf6..bda9b64 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
@@ -19,16 +19,17 @@ package 
org.apache.shardingsphere.infra.executor.sql.context;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.rewrite.engine.result.GenericSQLRewriteResult;
 import 
org.apache.shardingsphere.infra.rewrite.engine.result.RouteSQLRewriteResult;
 import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
 import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteUnit;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.schema.model.schema.physical.model.table.PhysicalTableMetaData;
-import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -48,20 +49,20 @@ public final class ExecutionContextBuilder {
     /**
      * Build execution contexts.
      * 
-     * @param schema schema
+     * @param metaData meta data
      * @param sqlRewriteResult SQL rewrite result
      * @param sqlStatementContext SQL statement context
      * @return execution contexts
      */
-    public static Collection<ExecutionUnit> build(final ShardingSphereSchema 
schema, final SQLRewriteResult sqlRewriteResult, final SQLStatementContext<?> 
sqlStatementContext) {
+    public static Collection<ExecutionUnit> build(final ShardingSphereMetaData 
metaData, final SQLRewriteResult sqlRewriteResult, final SQLStatementContext<?> 
sqlStatementContext) {
         return sqlRewriteResult instanceof GenericSQLRewriteResult
-                ? build(schema, (GenericSQLRewriteResult) sqlRewriteResult, 
sqlStatementContext) : build(schema, (RouteSQLRewriteResult) sqlRewriteResult);
+                ? build(metaData, (GenericSQLRewriteResult) sqlRewriteResult, 
sqlStatementContext) : build(metaData.getSchema(), (RouteSQLRewriteResult) 
sqlRewriteResult);
     }
     
-    private static Collection<ExecutionUnit> build(final ShardingSphereSchema 
schema, final GenericSQLRewriteResult sqlRewriteResult, final 
SQLStatementContext<?> sqlStatementContext) {
-        String dataSourceName = 
schema.getDataSourcesMetaData().getAllInstanceDataSourceNames().iterator().next();
+    private static Collection<ExecutionUnit> build(final 
ShardingSphereMetaData metaData, final GenericSQLRewriteResult 
sqlRewriteResult, final SQLStatementContext<?> sqlStatementContext) {
+        String dataSourceName = 
metaData.getResource().getDataSourcesMetaData().getAllInstanceDataSourceNames().iterator().next();
         return Collections.singletonList(new ExecutionUnit(dataSourceName,
-                new SQLUnit(sqlRewriteResult.getSqlRewriteUnit().getSql(), 
sqlRewriteResult.getSqlRewriteUnit().getParameters(), 
getSQLRuntimeContext(schema, sqlStatementContext))));
+                new SQLUnit(sqlRewriteResult.getSqlRewriteUnit().getSql(), 
sqlRewriteResult.getSqlRewriteUnit().getParameters(), 
getSQLRuntimeContext(metaData.getSchema(), sqlStatementContext))));
     }
     
     private static Collection<ExecutionUnit> build(final ShardingSphereSchema 
schema, final RouteSQLRewriteResult sqlRewriteResult) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java
index dbae803..27ab273 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilderTest.java
@@ -18,6 +18,8 @@
 package org.apache.shardingsphere.infra.executor.sql.context;
 
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.schema.model.addressing.TableAddressingMetaData;
 import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
@@ -56,8 +58,10 @@ public final class ExecutionContextBuilderTest {
         DataSourcesMetaData dataSourcesMetaData = 
mock(DataSourcesMetaData.class);
         String firstDataSourceName = "firstDataSourceName";
         
when(dataSourcesMetaData.getAllInstanceDataSourceNames()).thenReturn(Arrays.asList(firstDataSourceName,
 "lastDataSourceName"));
+        ShardingSphereResource resource = new 
ShardingSphereResource(Collections.emptyMap(), dataSourcesMetaData, 
mock(CachedDatabaseMetaData.class));
         ShardingSphereSchema schema = new 
ShardingSphereSchema(dataSourcesMetaData, mock(TableAddressingMetaData.class), 
buildPhysicalSchemaMetaData(), mock(CachedDatabaseMetaData.class));
-        Collection<ExecutionUnit> actual = 
ExecutionContextBuilder.build(schema, genericSQLRewriteResult, 
mock(SQLStatementContext.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData("name", 
Collections.emptyList(), Collections.emptyList(), resource, schema);
+        Collection<ExecutionUnit> actual = 
ExecutionContextBuilder.build(metaData, genericSQLRewriteResult, 
mock(SQLStatementContext.class));
         Collection<ExecutionUnit> expected = Collections.singletonList(new 
ExecutionUnit(firstDataSourceName, new SQLUnit(sql, parameters)));
         assertThat(actual, is(expected));
     }
@@ -71,9 +75,11 @@ public final class ExecutionContextBuilderTest {
         Map<RouteUnit, SQLRewriteUnit> sqlRewriteUnits = new HashMap<>(2, 1);
         sqlRewriteUnits.put(routeUnit1, sqlRewriteUnit1);
         sqlRewriteUnits.put(routeUnit2, sqlRewriteUnit2);
+        ShardingSphereResource resource = new 
ShardingSphereResource(Collections.emptyMap(), mock(DataSourcesMetaData.class), 
mock(CachedDatabaseMetaData.class));
         ShardingSphereSchema schema = new ShardingSphereSchema(
                 mock(DataSourcesMetaData.class), 
mock(TableAddressingMetaData.class), buildPhysicalSchemaMetaData(), 
mock(CachedDatabaseMetaData.class));
-        Collection<ExecutionUnit> actual = 
ExecutionContextBuilder.build(schema, new 
RouteSQLRewriteResult(sqlRewriteUnits), mock(SQLStatementContext.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData("name", 
Collections.emptyList(), Collections.emptyList(), resource, schema);
+        Collection<ExecutionUnit> actual = 
ExecutionContextBuilder.build(metaData, new 
RouteSQLRewriteResult(sqlRewriteUnits), mock(SQLStatementContext.class));
         ExecutionUnit expectedUnit1 = new ExecutionUnit("actualName1", new 
SQLUnit("sql1", Collections.singletonList("parameter1")));
         ExecutionUnit expectedUnit2 = new ExecutionUnit("actualName2", new 
SQLUnit("sql2", Collections.singletonList("parameter2")));
         Collection<ExecutionUnit> expected = new LinkedHashSet<>(2, 1);
@@ -89,9 +95,11 @@ public final class ExecutionContextBuilderTest {
         SQLRewriteUnit sqlRewriteUnit2 = new SQLRewriteUnit("sql2", 
Collections.singletonList("parameter2"));
         Map<RouteUnit, SQLRewriteUnit> sqlRewriteUnits = new HashMap<>(2, 1);
         sqlRewriteUnits.put(routeUnit2, sqlRewriteUnit2);
+        ShardingSphereResource resource = new 
ShardingSphereResource(Collections.emptyMap(), mock(DataSourcesMetaData.class), 
mock(CachedDatabaseMetaData.class));
         ShardingSphereSchema schema = new ShardingSphereSchema(
                 mock(DataSourcesMetaData.class), 
mock(TableAddressingMetaData.class), 
buildPhysicalSchemaMetaDataWithoutPrimaryKey(), 
mock(CachedDatabaseMetaData.class));
-        Collection<ExecutionUnit> actual = 
ExecutionContextBuilder.build(schema, new 
RouteSQLRewriteResult(sqlRewriteUnits), mock(SQLStatementContext.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData("name", 
Collections.emptyList(), Collections.emptyList(), resource, schema);
+        Collection<ExecutionUnit> actual = 
ExecutionContextBuilder.build(metaData, new 
RouteSQLRewriteResult(sqlRewriteUnits), mock(SQLStatementContext.class));
         ExecutionUnit expectedUnit2 = new ExecutionUnit("actualName2", new 
SQLUnit("sql2", Collections.singletonList("parameter2")));
         Collection<ExecutionUnit> expected = new LinkedHashSet<>(1, 1);
         expected.add(expectedUnit2);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/engine/SQLRouteEngineTest.java
 
b/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/engine/SQLRouteEngineTest.java
index f6edb65..3657ca3 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/engine/SQLRouteEngineTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-route/src/test/java/org/apache/shardingsphere/infra/route/engine/SQLRouteEngineTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.infra.route.engine;
 
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
@@ -42,6 +43,7 @@ import java.util.Collections;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -66,7 +68,8 @@ public final class SQLRouteEngineTest {
     @Test
     public void assertRouteSuccess() {
         LogicSQL logicSQL = new LogicSQL(mock(SQLStatementContext.class), 
"SELECT 1", Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(new RouteRuleFixture()), Collections.emptyMap(), 
this.schema);
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(new RouteRuleFixture()), 
mock(ShardingSphereResource.class, RETURNS_DEEP_STUBS), schema);
         SQLRouteEngine sqlRouteEngine = new 
SQLRouteEngine(Collections.singleton(new RouteRuleFixture()), props);
         setSPIRoutingHook(sqlRouteEngine);
         RouteContext actual = sqlRouteEngine.route(logicSQL, metaData);
@@ -76,13 +79,14 @@ public final class SQLRouteEngineTest {
         assertThat(routeUnit.getDataSourceMapper().getActualName(), 
is("ds_0"));
         assertTrue(routeUnit.getTableMappers().isEmpty());
         verify(routingHook).start("SELECT 1");
-        verify(routingHook).finishSuccess(actual, 
this.schema.getSchemaMetaData());
+        verify(routingHook).finishSuccess(actual, schema.getSchemaMetaData());
     }
     
     @Test(expected = UnsupportedOperationException.class)
     public void assertRouteFailure() {
         LogicSQL logicSQL = new LogicSQL(mock(SQLStatementContext.class), 
"SELECT 1", Collections.emptyList());
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData("logic_schema", Collections.emptyList(), 
Collections.singleton(new RouteRuleFixture()), Collections.emptyMap(), 
this.schema);
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "logic_schema", Collections.emptyList(), 
Collections.singleton(new RouteRuleFixture()), 
mock(ShardingSphereResource.class, RETURNS_DEEP_STUBS), schema);
         SQLRouteEngine sqlRouteEngine = new 
SQLRouteEngine(Collections.singleton(new RouteFailureRuleFixture()), props);
         setSPIRoutingHook(sqlRouteEngine);
         try {
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
index 6e47913..6a3ce80 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSource.java
@@ -100,7 +100,7 @@ public final class ShardingSphereDataSource extends 
AbstractUnsupportedOperation
      * @return data sources
      */
     public Map<String, DataSource> getDataSourceMap() {
-        return schemaContexts.getDefaultMetaData().getDataSources();
+        return 
schemaContexts.getDefaultMetaData().getResource().getDataSources();
     }
     
     @Override
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/main/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSource.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/main/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSource.java
index 8b9f234..7334d83 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/main/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSource.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/main/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSource.java
@@ -62,14 +62,14 @@ public final class GovernanceShardingSphereDataSource 
extends AbstractUnsupporte
     public GovernanceShardingSphereDataSource(final GovernanceConfiguration 
governanceConfig) throws SQLException {
         GovernanceFacade governanceFacade = 
createGovernanceFacade(governanceConfig);
         schemaContexts = new 
GovernanceSchemaContexts(createSchemaContexts(governanceFacade), 
governanceFacade);
-        transactionContexts = 
createTransactionContexts(schemaContexts.getDatabaseType(), 
schemaContexts.getDefaultMetaData().getDataSources());
+        transactionContexts = 
createTransactionContexts(schemaContexts.getDatabaseType(), 
schemaContexts.getDefaultMetaData().getResource().getDataSources());
     }
     
     public GovernanceShardingSphereDataSource(final Map<String, DataSource> 
dataSourceMap, final Collection<RuleConfiguration> ruleConfigs, 
                                               final Properties props, final 
GovernanceConfiguration governanceConfig) throws SQLException {
         GovernanceFacade governanceFacade = 
createGovernanceFacade(governanceConfig);
         schemaContexts = new 
GovernanceSchemaContexts(createSchemaContexts(dataSourceMap, ruleConfigs, 
props), governanceFacade);
-        transactionContexts = 
createTransactionContexts(schemaContexts.getDatabaseType(), 
schemaContexts.getDefaultMetaData().getDataSources());
+        transactionContexts = 
createTransactionContexts(schemaContexts.getDatabaseType(), 
schemaContexts.getDefaultMetaData().getResource().getDataSources());
         uploadLocalConfiguration(governanceFacade);
     }
     
@@ -119,7 +119,7 @@ public final class GovernanceShardingSphereDataSource 
extends AbstractUnsupporte
     }
     
     private void uploadLocalConfiguration(final GovernanceFacade 
governanceFacade) {
-        Map<String, DataSourceConfiguration> dataSourceConfigs = 
DataSourceConverter.getDataSourceConfigurationMap(schemaContexts.getDefaultMetaData().getDataSources());
+        Map<String, DataSourceConfiguration> dataSourceConfigs = 
DataSourceConverter.getDataSourceConfigurationMap(schemaContexts.getDefaultMetaData().getResource().getDataSources());
         Collection<RuleConfiguration> ruleConfigurations = 
schemaContexts.getDefaultMetaData().getConfigurations();
         
governanceFacade.onlineInstance(Collections.singletonMap(DefaultSchema.LOGIC_NAME,
 dataSourceConfigs),
                 Collections.singletonMap(DefaultSchema.LOGIC_NAME, 
ruleConfigurations), null, schemaContexts.getProps().getProps());
@@ -152,6 +152,6 @@ public final class GovernanceShardingSphereDataSource 
extends AbstractUnsupporte
     }
     
     private Map<String, DataSource> getDataSourceMap() {
-        return schemaContexts.getDefaultMetaData().getDataSources();
+        return 
schemaContexts.getDefaultMetaData().getResource().getDataSources();
     }
 }
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSourceTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSourceTest.java
index 95c7b51..0acaec4 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSourceTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/internal/datasource/GovernanceShardingSphereDataSourceTest.java
@@ -59,14 +59,14 @@ import static org.junit.Assert.assertThat;
 
 public final class GovernanceShardingSphereDataSourceTest {
     
-    private static GovernanceSchemaContexts governanceSchemaContexts;
+    private static GovernanceSchemaContexts schemaContexts;
     
     @BeforeClass
     public static void setUp() throws SQLException, IOException, 
URISyntaxException {
         SchemaContexts schemaContexts = 
getShardingSphereDataSource().getSchemaContexts();
-        GovernanceShardingSphereDataSource governanceDataSource = new 
GovernanceShardingSphereDataSource(schemaContexts.getDefaultMetaData().getDataSources(),
+        GovernanceShardingSphereDataSource governanceDataSource = new 
GovernanceShardingSphereDataSource(schemaContexts.getDefaultMetaData().getResource().getDataSources(),
                 schemaContexts.getDefaultMetaData().getConfigurations(), 
schemaContexts.getProps().getProps(), getGovernanceConfiguration());
-        governanceSchemaContexts = (GovernanceSchemaContexts) 
governanceDataSource.getSchemaContexts();
+        GovernanceShardingSphereDataSourceTest.schemaContexts = 
(GovernanceSchemaContexts) governanceDataSource.getSchemaContexts();
     }
     
     private static ShardingSphereDataSource getShardingSphereDataSource() 
throws IOException, SQLException, URISyntaxException {
@@ -97,8 +97,8 @@ public final class GovernanceShardingSphereDataSourceTest {
     
     @Test
     public void assertRenewRules() throws SQLException {
-        governanceSchemaContexts.renew(new 
RuleConfigurationsChangedEvent(DefaultSchema.LOGIC_NAME, 
Arrays.asList(getShardingRuleConfiguration(), 
getReplicaQueryRuleConfiguration())));
-        assertThat(((ShardingRule) 
governanceSchemaContexts.getDefaultMetaData().getRules().iterator().next()).getTableRules().size(),
 is(1));
+        schemaContexts.renew(new 
RuleConfigurationsChangedEvent(DefaultSchema.LOGIC_NAME, 
Arrays.asList(getShardingRuleConfiguration(), 
getReplicaQueryRuleConfiguration())));
+        assertThat(((ShardingRule) 
schemaContexts.getDefaultMetaData().getRules().iterator().next()).getTableRules().size(),
 is(1));
     }
     
     private ShardingRuleConfiguration getShardingRuleConfiguration() {
@@ -116,8 +116,8 @@ public final class GovernanceShardingSphereDataSourceTest {
     
     @Test
     public void assertRenewDataSource() throws SQLException {
-        governanceSchemaContexts.renew(new 
DataSourceChangedEvent(DefaultSchema.LOGIC_NAME, 
getDataSourceConfigurations()));
-        
assertThat(governanceSchemaContexts.getDefaultMetaData().getDataSources().size(),
 is(3));
+        schemaContexts.renew(new 
DataSourceChangedEvent(DefaultSchema.LOGIC_NAME, 
getDataSourceConfigurations()));
+        
assertThat(schemaContexts.getDefaultMetaData().getResource().getDataSources().size(),
 is(3));
     }
     
     private Map<String, DataSourceConfiguration> getDataSourceConfigurations() 
{
@@ -135,8 +135,8 @@ public final class GovernanceShardingSphereDataSourceTest {
     
     @Test
     public void assertRenewProperties() {
-        governanceSchemaContexts.renew(getPropertiesChangedEvent());
-        
assertThat(governanceSchemaContexts.getProps().getProps().getProperty(ConfigurationPropertyKey.SQL_SHOW.getKey()),
 is("true"));
+        schemaContexts.renew(getPropertiesChangedEvent());
+        
assertThat(schemaContexts.getProps().getProps().getProperty(ConfigurationPropertyKey.SQL_SHOW.getKey()),
 is("true"));
     }
     
     private PropertiesChangedEvent getPropertiesChangedEvent() {
@@ -147,6 +147,6 @@ public final class GovernanceShardingSphereDataSourceTest {
     
     @Test
     public void assertRenewDisabledState() {
-        governanceSchemaContexts.renew(new DisabledStateChangedEvent(new 
GovernanceSchema("logic_db.replica_ds"), true));
+        schemaContexts.renew(new DisabledStateChangedEvent(new 
GovernanceSchema("logic_db.replica_ds"), true));
     }
 }
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootEncryptTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootEncryptTest.java
index 35e38f3..b6de73d 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootEncryptTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootEncryptTest.java
@@ -59,7 +59,7 @@ public class GovernanceSpringBootEncryptTest {
         Field field = 
GovernanceShardingSphereDataSource.class.getDeclaredField("schemaContexts");
         field.setAccessible(true);
         SchemaContexts schemaContexts = (SchemaContexts) field.get(dataSource);
-        BasicDataSource embedDataSource = (BasicDataSource) 
schemaContexts.getDefaultMetaData().getDataSources().values().iterator().next();
+        BasicDataSource embedDataSource = (BasicDataSource) 
schemaContexts.getDefaultMetaData().getResource().getDataSources().values().iterator().next();
         assertThat(embedDataSource.getMaxTotal(), is(100));
         assertThat(embedDataSource.getUsername(), is("sa"));
         AlgorithmProvidedEncryptRuleConfiguration configuration =
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryEncryptTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegis
 [...]
index f4a1be7..0bef7e3 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryEncryptTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryEncryptTest.java
@@ -79,7 +79,7 @@ public class GovernanceSpringBootRegistryEncryptTest {
         Field field = 
GovernanceShardingSphereDataSource.class.getDeclaredField("schemaContexts");
         field.setAccessible(true);
         SchemaContexts schemaContexts = (SchemaContexts) field.get(dataSource);
-        BasicDataSource embedDataSource = (BasicDataSource) 
schemaContexts.getDefaultMetaData().getDataSources().values().iterator().next();
+        BasicDataSource embedDataSource = (BasicDataSource) 
schemaContexts.getDefaultMetaData().getResource().getDataSources().values().iterator().next();
         assertThat(embedDataSource.getMaxTotal(), is(100));
         assertThat(embedDataSource.getUsername(), is("sa"));
         EncryptRuleConfiguration config = (EncryptRuleConfiguration) 
schemaContexts.getDefaultMetaData().getConfigurations().iterator().next();
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryReplicaQueryTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBoot
 [...]
index 73f80c5..779e3a5 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryReplicaQueryTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryReplicaQueryTest.java
@@ -73,7 +73,7 @@ public class GovernanceSpringBootRegistryReplicaQueryTest {
         Field field = 
GovernanceShardingSphereDataSource.class.getDeclaredField("schemaContexts");
         field.setAccessible(true);
         SchemaContexts schemaContexts = (SchemaContexts) field.get(dataSource);
-        for (DataSource each : 
schemaContexts.getDefaultMetaData().getDataSources().values()) {
+        for (DataSource each : 
schemaContexts.getDefaultMetaData().getResource().getDataSources().values()) {
             assertThat(((BasicDataSource) each).getMaxTotal(), is(16));
             assertThat(((BasicDataSource) each).getUsername(), is("sa"));
         }
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryShardingTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegi
 [...]
index 5f9aeec..853e62d 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryShardingTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootRegistryShardingTest.java
@@ -77,7 +77,7 @@ public class GovernanceSpringBootRegistryShardingTest {
     public void assertWithShardingSphereDataSource() {
         assertTrue(dataSource instanceof GovernanceShardingSphereDataSource);
         SchemaContexts schemaContexts = getFieldValue("schemaContexts", 
GovernanceShardingSphereDataSource.class, dataSource);
-        for (DataSource each : 
schemaContexts.getDefaultMetaData().getDataSources().values()) {
+        for (DataSource each : 
schemaContexts.getDefaultMetaData().getResource().getDataSources().values()) {
             assertThat(((BasicDataSource) each).getMaxTotal(), is(16));
         }
         
assertTrue(schemaContexts.getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootReplicaQueryTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootReplicaQ
 [...]
index 56341b4..524cd4c 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootReplicaQueryTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootReplicaQueryTest.java
@@ -61,7 +61,7 @@ public class GovernanceSpringBootReplicaQueryTest {
         Field field = 
GovernanceShardingSphereDataSource.class.getDeclaredField("schemaContexts");
         field.setAccessible(true);
         SchemaContexts schemaContexts = (SchemaContexts) field.get(dataSource);
-        for (DataSource each : 
schemaContexts.getDefaultMetaData().getDataSources().values()) {
+        for (DataSource each : 
schemaContexts.getDefaultMetaData().getResource().getDataSources().values()) {
             assertThat(((BasicDataSource) each).getMaxTotal(), is(16));
             assertThat(((BasicDataSource) each).getUsername(), is("sa"));
         }
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootShardingTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootShardingTest.java
index ce7f295..f21f9bf 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootShardingTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/type/GovernanceSpringBootShardingTest.java
@@ -60,7 +60,7 @@ public class GovernanceSpringBootShardingTest {
     public void assertWithShardingSphereDataSource() {
         assertTrue(dataSource instanceof GovernanceShardingSphereDataSource);
         SchemaContexts schemaContexts = getFieldValue("schemaContexts", 
GovernanceShardingSphereDataSource.class, dataSource);
-        for (DataSource each : 
schemaContexts.getDefaultMetaData().getDataSources().values()) {
+        for (DataSource each : 
schemaContexts.getDefaultMetaData().getResource().getDataSources().values()) {
             assertThat(((BasicDataSource) each).getMaxTotal(), is(16));
         }
         
assertTrue(schemaContexts.getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingNamespaceTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingNamespaceTest.java
index 70e99c5..d413fc6 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingNamespaceTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingNamespaceTest.java
@@ -170,7 +170,7 @@ public class GovernanceShardingNamespaceTest extends 
AbstractJUnit4SpringContext
     private Map<String, DataSource> getDataSourceMap(final String 
dataSourceName) {
         GovernanceShardingSphereDataSource shardingSphereDataSource = 
applicationContext.getBean(dataSourceName, 
GovernanceShardingSphereDataSource.class);
         SchemaContexts schemaContexts = (SchemaContexts) 
FieldValueUtil.getFieldValue(shardingSphereDataSource, "schemaContexts");
-        return schemaContexts.getDefaultMetaData().getDataSources();
+        return 
schemaContexts.getDefaultMetaData().getResource().getDataSources();
     }
     
     private ShardingRule getShardingRule(final String dataSourceName) {
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingReplicaQueryNamespaceTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingReplicaQu
 [...]
index 16054fb..c6dfe0a 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingReplicaQueryNamespaceTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/GovernanceShardingReplicaQueryNamespaceTest.java
@@ -59,7 +59,7 @@ public class GovernanceShardingReplicaQueryNamespaceTest 
extends AbstractJUnit4S
     private Map<String, DataSource> getDataSourceMap(final String 
dataSourceName) {
         GovernanceShardingSphereDataSource shardingSphereDataSource = 
applicationContext.getBean(dataSourceName, 
GovernanceShardingSphereDataSource.class);
         SchemaContexts schemaContexts = (SchemaContexts) 
FieldValueUtil.getFieldValue(shardingSphereDataSource, "schemaContexts");
-        return schemaContexts.getDefaultMetaData().getDataSources();
+        return 
schemaContexts.getDefaultMetaData().getResource().getDataSources();
     }
     
     private ShardingRule getShardingRule(final String dataSourceName) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
index 186069f..48cffd0 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
@@ -112,7 +112,8 @@ public final class JDBCDatabaseCommunicationEngine 
implements DatabaseCommunicat
     
     private Optional<PhysicalTableMetaData> loadTableMetaData(final String 
tableName) throws SQLException {
         SchemaMetaDataLoader loader = new 
SchemaMetaDataLoader(metaData.getRules());
-        return 
loader.load(ProxyContext.getInstance().getSchemaContexts().getDatabaseType(), 
metaData.getDataSources(), tableName, 
ProxyContext.getInstance().getSchemaContexts().getProps());
+        return loader.load(
+                
ProxyContext.getInstance().getSchemaContexts().getDatabaseType(), 
metaData.getResource().getDataSources(), tableName, 
ProxyContext.getInstance().getSchemaContexts().getProps());
     }
     
     private BackendResponse merge(final SQLStatementContext<?> 
sqlStatementContext) throws SQLException {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSource.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSource.java
index 518b6cf..1504c93 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSource.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSource.java
@@ -76,7 +76,7 @@ public final class JDBCBackendDataSource implements 
BackendDataSource {
     @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
     public List<Connection> getConnections(final String schemaName, final 
String dataSourceName,
                                            final int connectionSize, final 
ConnectionMode connectionMode, final TransactionType transactionType) throws 
SQLException {
-        DataSource dataSource = 
ProxyContext.getInstance().getSchemaContexts().getMetaDataMap().get(schemaName).getDataSources().get(dataSourceName);
+        DataSource dataSource = 
ProxyContext.getInstance().getSchemaContexts().getMetaDataMap().get(schemaName).getResource().getDataSources().get(dataSourceName);
         Preconditions.checkNotNull(dataSource, "Can not get connection from 
datasource %s.", dataSourceName);
         if (1 == connectionSize) {
             return Collections.singletonList(createConnection(schemaName, 
dataSourceName, dataSource, transactionType));
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
index 2d21d89..c8e08b7 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
@@ -112,7 +112,7 @@ public final class ProxyContext {
         if (schemaNames.isEmpty()) {
             return Optional.empty();
         }
-        Map<String, DataSource> dataSources = 
Objects.requireNonNull(getMetaData(schemaNames.get(0))).getDataSources();
+        Map<String, DataSource> dataSources = 
Objects.requireNonNull(getMetaData(schemaNames.get(0))).getResource().getDataSources();
         return dataSources.values().stream().findFirst();
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSourceTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSourceTest.java
index 380940d..c7a9324 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSourceTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/datasource/JDBCBackendDataSourceTest.java
@@ -80,7 +80,7 @@ public final class JDBCBackendDataSourceTest {
     private Map<String, ShardingSphereMetaData> createMetaDataMap() {
         ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
         when(metaData.getName()).thenReturn("schema");
-        when(metaData.getDataSources()).thenReturn(mockDataSources(2));
+        
when(metaData.getResource().getDataSources()).thenReturn(mockDataSources(2));
         return Collections.singletonMap("schema", metaData);
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
index 35c56ca128..c41abc2 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
@@ -44,6 +44,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -117,9 +118,9 @@ public final class ProxyContextTest {
     }
     
     private Map<String, ShardingSphereMetaData> mockMetaDataMap(final 
Map<String, DataSource> mockDataSourceMap) {
-        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
         when(metaData.getName()).thenReturn("schema");
-        when(metaData.getDataSources()).thenReturn(mockDataSourceMap);
+        
when(metaData.getResource().getDataSources()).thenReturn(mockDataSourceMap);
         return Collections.singletonMap("schema", metaData);
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandlerTest.java
index 832301f..b826700 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandlerTest.java
@@ -5,9 +5,12 @@ import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties
 import 
org.apache.shardingsphere.infra.context.schema.impl.StandardSchemaContexts;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorKernel;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.CachedDatabaseMetaData;
+import 
org.apache.shardingsphere.infra.schema.model.datasource.DataSourcesMetaData;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.junit.Before;
@@ -59,8 +62,10 @@ public final class ShardingCTLExplainBackendHandlerTest {
     }
     
     private Map<String, ShardingSphereMetaData> getMetaDataMap() {
-        ShardingSphereMetaData metaData = new ShardingSphereMetaData("schema", 
Collections.emptyList(),
-                Collections.singleton(mock(ShardingSphereRule.class)), 
Collections.singletonMap("ds0", mock(DataSource.class)), 
mock(ShardingSphereSchema.class, RETURNS_DEEP_STUBS));
+        ShardingSphereResource resource = new ShardingSphereResource(
+                Collections.singletonMap("ds0", mock(DataSource.class)), 
mock(DataSourcesMetaData.class, RETURNS_DEEP_STUBS), 
mock(CachedDatabaseMetaData.class));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                "schema", Collections.emptyList(), 
Collections.singleton(mock(ShardingSphereRule.class)), resource, 
mock(ShardingSphereSchema.class, RETURNS_DEEP_STUBS));
         return Collections.singletonMap("schema", metaData);
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/impl/AbstractBootstrapInitializer.java
 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/impl/AbstractBootstrapInitializer.java
index 3096b0e..eaa0a7b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/impl/AbstractBootstrapInitializer.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/initializer/impl/AbstractBootstrapInitializer.java
@@ -100,7 +100,7 @@ public abstract class AbstractBootstrapInitializer 
implements BootstrapInitializ
         Map<String, ShardingTransactionManagerEngine> 
transactionManagerEngines = new 
HashMap<>(schemaContexts.getMetaDataMap().size(), 1);
         for (Entry<String, ShardingSphereMetaData> entry : 
schemaContexts.getMetaDataMap().entrySet()) {
             ShardingTransactionManagerEngine engine = new 
ShardingTransactionManagerEngine();
-            engine.init(schemaContexts.getDatabaseType(), 
entry.getValue().getDataSources());
+            engine.init(schemaContexts.getDatabaseType(), 
entry.getValue().getResource().getDataSources());
             transactionManagerEngines.put(entry.getKey(), engine);
         }
         return new StandardTransactionContexts(transactionManagerEngines);

Reply via email to