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

panjuan 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 4ad18d4c6e3 Move ProxyContext.getDatabase to ContextManager (#30009)
4ad18d4c6e3 is described below

commit 4ad18d4c6e30616da901e48c22d4040a2f0df6e7
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Feb 6 15:16:39 2024 +0800

    Move ProxyContext.getDatabase to ContextManager (#30009)
---
 .../mode/manager/ContextManager.java               | 17 ++++++++++
 .../mode/manager/ContextManagerTest.java           | 24 ++++++++++++++
 .../proxy/backend/connector/DatabaseConnector.java |  2 +-
 .../connector/DatabaseConnectorFactory.java        |  2 +-
 .../proxy/backend/connector/ProxySQLExecutor.java  |  4 +--
 .../proxy/backend/context/ProxyContext.java        | 16 ---------
 .../backend/handler/ProxySQLComQueryParser.java    |  2 +-
 .../admin/DatabaseAdminQueryBackendHandler.java    |  2 +-
 .../executor/AbstractDatabaseMetaDataExecutor.java |  2 +-
 .../data/impl/UnicastDatabaseBackendHandler.java   |  5 +--
 .../distsql/DistSQLQueryBackendHandler.java        |  2 +-
 .../distsql/DistSQLUpdateBackendHandler.java       |  2 +-
 .../ral/queryable/ExportMetaDataExecutor.java      |  2 +-
 .../updatable/RefreshDatabaseMetaDataExecutor.java |  3 +-
 .../YamlDatabaseConfigurationImportExecutor.java   |  2 +-
 .../connector/DatabaseConnectorFactoryTest.java    |  3 +-
 .../backend/connector/DatabaseConnectorTest.java   |  6 ++--
 .../proxy/backend/context/ProxyContextTest.java    | 38 +---------------------
 .../handler/ProxyBackendHandlerFactoryTest.java    |  2 +-
 .../DatabaseAdminQueryBackendHandlerTest.java      |  2 +-
 .../DefaultDatabaseMetaDataExecutorTest.java       |  2 +-
 .../impl/UnicastDatabaseBackendHandlerTest.java    |  4 +--
 .../distsql/DistSQLBackendHandlerFactoryTest.java  |  6 ++--
 .../ral/QueryableRALBackendHandlerTest.java        |  3 +-
 .../ral/queryable/ExportMetaDataExecutorTest.java  |  2 +-
 .../updatable/RefreshTableMetaDataUpdaterTest.java |  4 +--
 .../UnregisterStorageUnitExecutorTest.java         |  6 ++--
 .../handler/admin/MySQLAdminExecutorCreator.java   |  4 +--
 .../handler/admin/executor/ShowTablesExecutor.java |  6 ++--
 .../executor/UnicastResourceShowExecutor.java      |  4 +--
 .../admin/MySQLAdminExecutorCreatorTest.java       |  6 ++--
 .../admin/executor/ShowTablesExecutorTest.java     |  7 +---
 .../SelectInformationSchemataExecutorTest.java     |  4 ++-
 .../postgresql/command/query/extended/Portal.java  |  2 +-
 .../describe/PostgreSQLComDescribeExecutor.java    |  4 +--
 .../command/query/extended/PortalTest.java         |  8 ++---
 .../bind/PostgreSQLComBindExecutorTest.java        |  4 +--
 .../PostgreSQLComDescribeExecutorTest.java         | 14 ++------
 38 files changed, 101 insertions(+), 127 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 4ff07e65a48..a8127e7a653 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -17,12 +17,16 @@
 
 package org.apache.shardingsphere.mode.manager;
 
+import com.google.common.base.Strings;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
+import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -99,6 +103,19 @@ public final class ContextManager implements AutoCloseable {
         this.metaDataContexts.set(metaDataContexts);
     }
     
+    /**
+     * Get database.
+     *
+     * @param name database name
+     * @return got database
+     */
+    public ShardingSphereDatabase getDatabase(final String name) {
+        ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(name), 
NoDatabaseSelectedException::new);
+        ShardingSphereMetaData metaData = getMetaDataContexts().getMetaData();
+        
ShardingSpherePreconditions.checkState(metaData.containsDatabase(name), () -> 
new UnknownDatabaseException(name));
+        return metaData.getDatabase(name);
+    }
+    
     /**
      * Get storage units.
      *
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 8b907de9ea5..bbcd697b304 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -24,6 +24,8 @@ import 
org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.instance.mode.ModeContextManager;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -64,6 +66,8 @@ import java.util.stream.Collectors;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -221,6 +225,26 @@ class ContextManagerTest {
         assertThat(actual.getUsername(), is("test"));
     }
     
+    @Test
+    void assertGetDatabaseWithNull() {
+        assertThrows(NoDatabaseSelectedException.class, () -> 
contextManager.getDatabase(null));
+    }
+    
+    @Test
+    void assertGetDatabaseWithEmptyString() {
+        assertThrows(NoDatabaseSelectedException.class, () -> 
contextManager.getDatabase(""));
+    }
+    
+    @Test
+    void assertGetDatabaseWhenNotExisted() {
+        assertThrows(UnknownDatabaseException.class, () -> 
contextManager.getDatabase("bar_db"));
+    }
+    
+    @Test
+    void assertGetDatabase() {
+        assertNotNull(contextManager.getDatabase("foo_db"));
+    }
+    
     @Test
     void assertAlterRuleConfiguration() {
         ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
index fe62de1687d..7bfa9e62012 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
@@ -128,7 +128,7 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     }
     
     private void failedIfBackendNotReady(final ConnectionSession 
connectionSession, final SQLStatementContext sqlStatementContext) {
-        ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
+        ShardingSphereDatabase database = 
ProxyContext.getInstance().getContextManager().getDatabase(connectionSession.getDatabaseName());
         boolean isSystemSchema = 
SystemSchemaUtils.containsSystemSchema(sqlStatementContext.getDatabaseType(), 
sqlStatementContext.getTablesContext().getSchemaNames(), database);
         ShardingSpherePreconditions.checkState(isSystemSchema || 
database.containsDataSource(), () -> new 
StorageUnitNotExistedException(connectionSession.getDatabaseName()));
         if (!isSystemSchema && !database.isComplete()) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactory.java
index 1d0662a9ee1..b2cd2db66f3 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactory.java
@@ -50,7 +50,7 @@ public final class DatabaseConnectorFactory {
      * @return created instance
      */
     public DatabaseConnector newInstance(final QueryContext queryContext, 
final ProxyDatabaseConnectionManager databaseConnectionManager, final boolean 
preferPreparedStatement) {
-        ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(databaseConnectionManager.getConnectionSession().getDatabaseName());
+        ShardingSphereDatabase database = 
ProxyContext.getInstance().getContextManager().getDatabase(databaseConnectionManager.getConnectionSession().getDatabaseName());
         String driverType = preferPreparedStatement || 
!queryContext.getParameters().isEmpty() ? JDBCDriverType.PREPARED_STATEMENT : 
JDBCDriverType.STATEMENT;
         DatabaseConnector result = new DatabaseConnector(driverType, database, 
queryContext, databaseConnectionManager);
         databaseConnectionManager.add(result);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
index ed4fb95cba8..05e039f58a0 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
@@ -204,7 +204,7 @@ public final class ProxySQLExecutor {
         JDBCBackendStatement statementManager = (JDBCBackendStatement) 
databaseConnectionManager.getConnectionSession().getStatementManager();
         DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(
                 type, maxConnectionsSizePerQuery, databaseConnectionManager, 
statementManager, new StatementOption(isReturnGeneratedKeys), rules,
-                
ProxyContext.getInstance().getDatabase(databaseConnectionManager.getConnectionSession().getDatabaseName()).getResourceMetaData().getStorageUnits());
+                
ProxyContext.getInstance().getContextManager().getDatabase(databaseConnectionManager.getConnectionSession().getDatabaseName()).getResourceMetaData().getStorageUnits());
         ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext;
         try {
             executionGroupContext = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits(),
@@ -231,7 +231,7 @@ public final class ProxySQLExecutor {
     }
     
     private List<ExecuteResult> getSaneExecuteResults(final ExecutionContext 
executionContext, final SQLException originalException) throws SQLException {
-        DatabaseType databaseType = 
ProxyContext.getInstance().getDatabase(databaseConnectionManager.getConnectionSession().getDatabaseName()).getProtocolType();
+        DatabaseType databaseType = 
ProxyContext.getInstance().getContextManager().getDatabase(databaseConnectionManager.getConnectionSession().getDatabaseName()).getProtocolType();
         Optional<ExecuteResult> executeResult = new 
SaneQueryResultEngine(databaseType).getSaneQueryResult(executionContext.getSqlStatementContext().getSqlStatement(),
 originalException);
         return executeResult.map(Collections::singletonList).orElseThrow(() -> 
originalException);
     }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
index e77add0397f..c2d3a545275 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
@@ -17,15 +17,11 @@
 
 package org.apache.shardingsphere.proxy.backend.context;
 
-import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.state.instance.InstanceStateContext;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.proxy.backend.connector.jdbc.datasource.JDBCBackendDataSource;
 
@@ -74,18 +70,6 @@ public final class ProxyContext {
         return 
contextManager.getMetaDataContexts().getMetaData().containsDatabase(name);
     }
     
-    /**
-     * Get database.
-     *
-     * @param name database name
-     * @return got database
-     */
-    public ShardingSphereDatabase getDatabase(final String name) {
-        ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(name), 
NoDatabaseSelectedException::new);
-        
ShardingSpherePreconditions.checkState(contextManager.getMetaDataContexts().getMetaData().containsDatabase(name),
 () -> new UnknownDatabaseException(name));
-        return 
contextManager.getMetaDataContexts().getMetaData().getDatabase(name);
-    }
-    
     /**
      * Get all database names.
      *
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxySQLComQueryParser.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxySQLComQueryParser.java
index f62eda42d96..1b933b0b43f 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxySQLComQueryParser.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxySQLComQueryParser.java
@@ -54,6 +54,6 @@ public final class ProxySQLComQueryParser {
         String databaseName = connectionSession.getDatabaseName();
         return Strings.isNullOrEmpty(databaseName) || 
!ProxyContext.getInstance().databaseExists(databaseName)
                 ? defaultDatabaseType
-                : 
ProxyContext.getInstance().getDatabase(databaseName).getProtocolType();
+                : 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getProtocolType();
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandler.java
index 52a5c43b7c3..60fc6652344 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandler.java
@@ -61,7 +61,7 @@ public final class DatabaseAdminQueryBackendHandler 
implements ProxyBackendHandl
     
     private List<QueryHeader> createResponseHeader() throws SQLException {
         List<QueryHeader> result = new 
ArrayList<>(queryResultMetaData.getColumnCount());
-        ShardingSphereDatabase database = null == 
connectionSession.getDatabaseName() ? null : 
ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
+        ShardingSphereDatabase database = null == 
connectionSession.getDatabaseName() ? null : 
ProxyContext.getInstance().getContextManager().getDatabase(connectionSession.getDatabaseName());
         DatabaseType databaseType = null == database ? 
connectionSession.getProtocolType() : database.getProtocolType();
         QueryHeaderBuilderEngine queryHeaderBuilderEngine = new 
QueryHeaderBuilderEngine(databaseType);
         for (int columnIndex = 1; columnIndex <= 
queryResultMetaData.getColumnCount(); columnIndex++) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
index 460a7333dc8..b1884b4f2b4 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
@@ -126,7 +126,7 @@ public abstract class AbstractDatabaseMetaDataExecutor 
implements DatabaseAdminQ
     }
     
     protected static Boolean hasDataSource(final String databaseName) {
-        return 
ProxyContext.getInstance().getDatabase(databaseName).containsDataSource();
+        return 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName).containsDataSource();
     }
     
     protected static boolean isAuthorized(final String databaseName, final 
Grantee grantee) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
index 6bcec191e2f..b29f6c5fde3 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
@@ -55,7 +55,8 @@ public final class UnicastDatabaseBackendHandler implements 
DatabaseBackendHandl
     public ResponseHeader execute() throws SQLException {
         String originalDatabaseName = 
connectionSession.getDefaultDatabaseName();
         String unicastDatabaseName = null == originalDatabaseName ? 
getFirstDatabaseName() : originalDatabaseName;
-        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(unicastDatabaseName).containsDataSource(),
 () -> new StorageUnitNotExistedException(unicastDatabaseName));
+        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getContextManager().getDatabase(unicastDatabaseName).containsDataSource(),
+                () -> new StorageUnitNotExistedException(unicastDatabaseName));
         try {
             connectionSession.setCurrentDatabase(unicastDatabaseName);
             databaseConnector = 
databaseConnectorFactory.newInstance(queryContext, 
connectionSession.getDatabaseConnectionManager(), false);
@@ -72,7 +73,7 @@ public final class UnicastDatabaseBackendHandler implements 
DatabaseBackendHandl
         }
         AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
         Optional<ShardingSpherePrivileges> privileges = 
authorityRule.findPrivileges(connectionSession.getGrantee());
-        Stream<String> databaseStream = databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getDatabase(each).containsDataSource());
+        Stream<String> databaseStream = databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getContextManager().getDatabase(each).containsDataSource());
         Optional<String> result = privileges.map(optional -> 
databaseStream.filter(optional::hasPrivileges).findFirst()).orElseGet(databaseStream::findFirst);
         ShardingSpherePreconditions.checkState(result.isPresent(), 
StorageUnitNotExistedException::new);
         return result.get();
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandler.java
index 819cc724f62..974f59de675 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLQueryBackendHandler.java
@@ -82,7 +82,7 @@ public final class DistSQLQueryBackendHandler extends 
DistSQLQueryExecuteEngine
     
     @Override
     protected ShardingSphereDatabase getDatabase(final String databaseName) {
-        return ProxyContext.getInstance().getDatabase(databaseName);
+        return 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName);
     }
     
     @Override
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandler.java
index a53cbf8c43c..6675b0fe1f5 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandler.java
@@ -47,6 +47,6 @@ public final class DistSQLUpdateBackendHandler extends 
DistSQLUpdateExecuteEngin
     
     @Override
     protected ShardingSphereDatabase getDatabase(final String databaseName) {
-        return ProxyContext.getInstance().getDatabase(databaseName);
+        return 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName);
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
index be97a1c4f79..3655d4e949a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
@@ -85,7 +85,7 @@ public final class ExportMetaDataExecutor implements 
DistSQLQueryExecutor<Export
     private Map<String, String> getDatabases(final ProxyContext proxyContext) {
         Map<String, String> result = new LinkedHashMap<>();
         proxyContext.getAllDatabaseNames().forEach(each -> {
-            ShardingSphereDatabase database = proxyContext.getDatabase(each);
+            ShardingSphereDatabase database = 
proxyContext.getContextManager().getDatabase(each);
             if 
(database.getResourceMetaData().getAllInstanceDataSourceNames().isEmpty()) {
                 return;
             }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
index 176b9196bb5..7d135701984 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
@@ -37,7 +37,8 @@ public final class RefreshDatabaseMetaDataExecutor implements 
DistSQLUpdateExecu
     @Override
     public void executeUpdate(final RefreshDatabaseMetaDataStatement 
sqlStatement, final ContextManager contextManager) throws SQLException {
         Optional<String> toBeRefreshedDatabaseName = 
sqlStatement.getDatabaseName();
-        Map<String, ShardingSphereDatabase> databases = 
toBeRefreshedDatabaseName.map(optional -> Collections.singletonMap(optional, 
ProxyContext.getInstance().getDatabase(optional)))
+        Map<String, ShardingSphereDatabase> databases = 
toBeRefreshedDatabaseName
+                .map(optional -> Collections.singletonMap(optional, 
ProxyContext.getInstance().getContextManager().getDatabase(optional)))
                 .orElseGet(() -> 
contextManager.getMetaDataContexts().getMetaData().getDatabases());
         for (ShardingSphereDatabase each : databases.values()) {
             if (!SystemSchemaUtils.isSystemSchema(each)) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index 1eb0bfb4c28..aa93f132e98 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -130,7 +130,7 @@ public final class YamlDatabaseConfigurationImportExecutor {
     private void checkDatabase(final String databaseName) {
         ShardingSpherePreconditions.checkNotNull(databaseName, () -> new 
UnsupportedSQLOperationException("Property `databaseName` in imported config is 
required"));
         if (ProxyContext.getInstance().databaseExists(databaseName)) {
-            
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getStorageUnits().isEmpty(),
+            
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getResourceMetaData().getStorageUnits().isEmpty(),
                     () -> new 
UnsupportedSQLOperationException(String.format("Database `%s` exists and is not 
empty,overwrite is not supported", databaseName)));
         }
     }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
index beb98549e3b..79c04823b7c 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
@@ -61,7 +61,6 @@ class DatabaseConnectorFactoryTest {
         ShardingSphereDatabase database = mockDatabase();
         ContextManager contextManager = mockContextManager(database);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
         DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(queryContext, 
databaseConnectionManager, false);
         assertThat(engine, instanceOf(DatabaseConnector.class));
     }
@@ -76,7 +75,6 @@ class DatabaseConnectorFactoryTest {
         ShardingSphereDatabase database = mockDatabase();
         ContextManager contextManager = mockContextManager(database);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
         assertThat(DatabaseConnectorFactory.getInstance().newInstance(new 
QueryContext(sqlStatementContext, "schemaName", Collections.emptyList()), 
databaseConnectionManager, false),
                 instanceOf(DatabaseConnector.class));
     }
@@ -87,6 +85,7 @@ class DatabaseConnectorFactoryTest {
                         mock(RuleMetaData.class), new 
ConfigurationProperties(new Properties())));
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+        when(result.getDatabase("foo_db")).thenReturn(database);
         return result;
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
index 599f33d4313..d8d87cb2ea1 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
@@ -111,8 +111,6 @@ class DatabaseConnectorTest {
         
when(databaseConnectionManager.getConnectionSession().getDatabaseName()).thenReturn("foo_db");
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db");
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
     }
     
     private ContextManager mockContextManager() {
@@ -122,10 +120,12 @@ class DatabaseConnectorTest {
         ShardingSphereDataPersistService shardingSphereDataPersistService = 
mock(ShardingSphereDataPersistService.class);
         
when(shardingSphereDataPersistService.load(any())).thenReturn(Optional.empty());
         
when(metaDataPersistService.getShardingSphereDataPersistService()).thenReturn(shardingSphereDataPersistService);
+        Map<String, ShardingSphereDatabase> databases = mockDatabases();
         MetaDataContexts metaDataContexts = new 
MetaDataContexts(metaDataPersistService,
-                new ShardingSphereMetaData(mockDatabases(), 
mock(ResourceMetaData.class), globalRuleMetaData, new 
ConfigurationProperties(new Properties())));
+                new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), globalRuleMetaData, new 
ConfigurationProperties(new Properties())));
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+        when(result.getDatabase("foo_db")).thenReturn(databases.get("foo_db"));
         return result;
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
index 9cb84d0edb7..59684048836 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java
@@ -17,17 +17,15 @@
 
 package org.apache.shardingsphere.proxy.backend.context;
 
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
-import org.apache.shardingsphere.infra.state.cluster.ClusterState;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.infra.state.cluster.ClusterState;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -44,8 +42,6 @@ import java.util.Properties;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
@@ -92,38 +88,6 @@ class ProxyContextTest {
         assertFalse(ProxyContext.getInstance().databaseExists("db_1"));
     }
     
-    @Test
-    void assertGetDatabaseWithNull() {
-        assertThrows(NoDatabaseSelectedException.class, () -> 
assertNull(ProxyContext.getInstance().getDatabase(null)));
-    }
-    
-    @Test
-    void assertGetDatabaseWithEmptyString() {
-        assertThrows(NoDatabaseSelectedException.class, () -> 
assertNull(ProxyContext.getInstance().getDatabase("")));
-    }
-    
-    @Test
-    void assertGetDatabaseWhenNotExisted() {
-        Map<String, ShardingSphereDatabase> databases = mockDatabases();
-        ContextManager contextManager = mock(ContextManager.class, 
RETURNS_DEEP_STUBS);
-        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class),
-                new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), new 
ConfigurationProperties(new Properties())));
-        
when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
-        ProxyContext.init(contextManager);
-        assertThrows(UnknownDatabaseException.class, () -> 
ProxyContext.getInstance().getDatabase("db1"));
-    }
-    
-    @Test
-    void assertGetDatabase() {
-        Map<String, ShardingSphereDatabase> databases = mockDatabases();
-        ContextManager contextManager = mock(ContextManager.class, 
RETURNS_DEEP_STUBS);
-        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class),
-                new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), new 
ConfigurationProperties(new Properties())));
-        
when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
-        ProxyContext.init(contextManager);
-        assertThat(databases.get("db"), 
is(ProxyContext.getInstance().getDatabase("db")));
-    }
-    
     @Test
     void assertGetAllDatabaseNames() {
         Map<String, ShardingSphereDatabase> databases = createDatabases();
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
index 1907ee74f18..de74883c779 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
@@ -176,7 +176,7 @@ class ProxyBackendHandlerFactoryTest {
         String sql = "SELECT * FROM t_order limit 1";
         ProxyContext proxyContext = ProxyContext.getInstance();
         when(proxyContext.getAllDatabaseNames()).thenReturn(new 
HashSet<>(Collections.singletonList("db")));
-        
when(proxyContext.getDatabase("db").containsDataSource()).thenReturn(true);
+        
when(proxyContext.getContextManager().getDatabase("db").containsDataSource()).thenReturn(true);
         SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
         ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DatabaseConnector.class));
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandlerTest.java
index 00b8a63611d..6a44a42d831 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryBackendHandlerTest.java
@@ -111,7 +111,7 @@ class DatabaseAdminQueryBackendHandlerTest {
     private ContextManager mockContextManager() {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
         when(database.getProtocolType()).thenReturn(databaseType);
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db")).thenReturn(database);
         ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singletonMap("foo_db", database), 
mock(ResourceMetaData.class),
                 mock(RuleMetaData.class), new ConfigurationProperties(new 
Properties()));
         return new ContextManager(new 
MetaDataContexts(mock(MetaDataPersistService.class), metaData), 
mock(InstanceContext.class));
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
index 28e7d9090b9..dc4bc475c7c 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DefaultDatabaseMetaDataExecutorTest.java
@@ -150,7 +150,7 @@ class DefaultDatabaseMetaDataExecutorTest {
         MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), new 
ShardingSphereMetaData(Collections.singletonMap("auth_db", database),
                 mock(ResourceMetaData.class), new 
RuleMetaData(Collections.singleton(authorityRule)), new 
ConfigurationProperties(new Properties())));
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
-        
when(ProxyContext.getInstance().getDatabase("auth_db")).thenReturn(database);
+        when(result.getDatabase("auth_db")).thenReturn(database);
         
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("auth_db"));
         return result;
     }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandlerTest.java
index abcd517d463..442200fc246 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandlerTest.java
@@ -109,7 +109,7 @@ class UnicastDatabaseBackendHandlerTest {
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         ShardingSphereDatabase database = createDatabases().get("db_0");
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(database);
+        when(contextManager.getDatabase("db_0")).thenReturn(database);
         ResponseHeader actual = unicastDatabaseBackendHandler.execute();
         assertThat(actual, instanceOf(UpdateResponseHeader.class));
     }
@@ -119,7 +119,7 @@ class UnicastDatabaseBackendHandlerTest {
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         ShardingSphereDatabase database = createDatabases().get("db_0");
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(database);
+        when(contextManager.getDatabase("db_0")).thenReturn(database);
         unicastDatabaseBackendHandler.execute();
         while (unicastDatabaseBackendHandler.next()) {
             
assertThat(unicastDatabaseBackendHandler.getRowData().getData().size(), is(1));
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
index 39e215dd0da..88b0ab3dc7f 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java
@@ -86,7 +86,6 @@ class DistSQLBackendHandlerFactoryTest {
         ContextManager contextManager = mockContextManager(database);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         
when(ProxyContext.getInstance().databaseExists("foo_db")).thenReturn(true);
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
         when(connectionSession.getDatabaseName()).thenReturn("foo_db");
     }
     
@@ -100,6 +99,7 @@ class DistSQLBackendHandlerFactoryTest {
     private ContextManager mockContextManager(final ShardingSphereDatabase 
database) {
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         MetaDataContexts metaDataContexts = mockMetaDataContexts(database);
+        when(result.getDatabase("foo_db")).thenReturn(database);
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
         
when(result.getInstanceContext().getModeContextManager()).thenReturn(mock(ModeContextManager.class));
         
when(result.getInstanceContext().getModeConfiguration().getType()).thenReturn("Cluster");
@@ -119,7 +119,7 @@ class DistSQLBackendHandlerFactoryTest {
     
     @Test
     void assertExecuteShardingTableRuleContext() throws SQLException {
-        
when(ProxyContext.getInstance().getDatabase("foo_db").getRuleMetaData()).thenReturn(new
 RuleMetaData(Collections.emptyList()));
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db").getRuleMetaData()).thenReturn(new
 RuleMetaData(Collections.emptyList()));
         assertThat(new 
DistSQLUpdateBackendHandler(mock(CreateShardingTableRuleStatement.class), 
connectionSession).execute(), instanceOf(UpdateResponseHeader.class));
     }
     
@@ -214,7 +214,7 @@ class DistSQLBackendHandlerFactoryTest {
         when(rule.getConfiguration()).thenReturn(ruleConfig);
         
when(ruleMetaData.findSingleRule(ShadowRule.class)).thenReturn(Optional.of(rule));
         when(database.getRuleMetaData()).thenReturn(ruleMetaData);
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db")).thenReturn(database);
     }
     
     private ShadowRuleConfiguration mockShadowRuleConfiguration() {
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
index c40cbce5190..ce584598220 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
@@ -72,7 +72,6 @@ class QueryableRALBackendHandlerTest {
         MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), metaData);
         ConnectionSession connectionSession = mock(ConnectionSession.class);
         when(connectionSession.getDatabaseName()).thenReturn("unknown");
-        
when(ProxyContext.getInstance().getDatabase("unknown")).thenThrow(UnknownDatabaseException.class);
         ContextManager contextManager = new ContextManager(metaDataContexts, 
mock(InstanceContext.class));
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         assertThrows(UnknownDatabaseException.class, () -> new 
DistSQLQueryBackendHandler(mock(ExportDatabaseConfigurationStatement.class), 
connectionSession).execute());
@@ -89,7 +88,7 @@ class QueryableRALBackendHandlerTest {
         when(database.getName()).thenReturn("foo_db");
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         when(database.getSchema("foo_db")).thenReturn(new 
ShardingSphereSchema(createTableMap(), Collections.emptyMap()));
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db")).thenReturn(database);
         assertDoesNotThrow(() -> new 
DistSQLQueryBackendHandler(createSqlStatement(), mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS)).execute());
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
index a1caeb251eb..a2fc21f0e73 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
@@ -144,7 +144,6 @@ class ExportMetaDataExecutorTest {
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("normal_db"));
-        
when(ProxyContext.getInstance().getDatabase("normal_db")).thenReturn(database);
         Collection<LocalDataQueryResultRow> actual = new 
ExportMetaDataExecutor().getRows(new ExportMetaDataStatement(null), 
contextManager);
         assertThat(actual.size(), is(1));
         LocalDataQueryResultRow row = actual.iterator().next();
@@ -175,6 +174,7 @@ class ExportMetaDataExecutorTest {
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
         when(result.getInstanceContext()).thenReturn(instanceContext);
+        when(result.getDatabase("normal_db")).thenReturn(database);
         return result;
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdaterTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdaterTest.java
index 0eb706b89a1..d0dadb5d949 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdaterTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdaterTest.java
@@ -58,7 +58,7 @@ class RefreshTableMetaDataUpdaterTest {
         
when(contextManager.getStorageUnits("foo_db")).thenReturn(Collections.emptyMap());
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
         when(database.getName()).thenReturn("foo_db");
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
+        when(contextManager.getDatabase("foo_db")).thenReturn(database);
         DistSQLUpdateBackendHandler backendHandler = new 
DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement(), 
mockConnectionSession("foo_db"));
         assertThrows(EmptyStorageUnitException.class, backendHandler::execute);
     }
@@ -79,7 +79,7 @@ class RefreshTableMetaDataUpdaterTest {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
         when(database.getName()).thenReturn("foo_db");
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
+        when(contextManager.getDatabase("foo_db")).thenReturn(database);
         DistSQLUpdateBackendHandler backendHandler = new 
DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement(), 
mockConnectionSession("foo_db"));
         ResponseHeader actual = backendHandler.execute();
         assertThat(actual, instanceOf(UpdateResponseHeader.class));
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitExecutorTest.java
index 6cafbe9275f..e6416bfcdfe 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitExecutorTest.java
@@ -90,7 +90,6 @@ class UnregisterStorageUnitExecutorTest {
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
         executor = new UnregisterStorageUnitExecutor();
     }
     
@@ -99,6 +98,7 @@ class UnregisterStorageUnitExecutorTest {
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
         
when(result.getInstanceContext().getModeContextManager()).thenReturn(modeContextManager);
+        when(result.getDatabase("foo_db")).thenReturn(database);
         return result;
     }
     
@@ -116,8 +116,8 @@ class UnregisterStorageUnitExecutorTest {
     }
     
     @Test
-    void assertExecuteUpdateWithhStorageUnitNameNotExisted() {
-        
when(ProxyContext.getInstance().getDatabase("foo_db").getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
+    void assertExecuteUpdateWithStorageUnitNameNotExisted() {
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db").getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
         executor.setDatabase(database);
         assertThrows(MissingRequiredStorageUnitsException.class,
                 () -> executor.executeUpdate(new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false, false), 
mock(ContextManager.class)));
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
index b8df4164c05..6c0a9b6e952 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
@@ -161,7 +161,7 @@ public final class MySQLAdminExecutorCreator implements 
DatabaseAdminExecutorCre
     
     private boolean isQueryInformationSchema(final String databaseName) {
         // TODO remove DefaultDatabaseMetaDataExecutor when sql federation can 
support all system table query
-        return INFORMATION_SCHEMA.equalsIgnoreCase(databaseName) && 
!ProxyContext.getInstance().getDatabase(databaseName).isComplete();
+        return INFORMATION_SCHEMA.equalsIgnoreCase(databaseName) && 
!ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete();
     }
     
     private boolean isQueryPerformanceSchema(final String databaseName) {
@@ -190,7 +190,7 @@ public final class MySQLAdminExecutorCreator implements 
DatabaseAdminExecutorCre
             return true;
         }
         for (String each : databaseNames) {
-            if 
(ProxyContext.getInstance().getDatabase(each).containsDataSource()) {
+            if 
(ProxyContext.getInstance().getContextManager().getDatabase(each).containsDataSource())
 {
                 return false;
             }
         }
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java
index 4b26f0b361f..f0dc75c3ccf 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java
@@ -51,8 +51,6 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor {
     
-    private static final String TABLE_TYPE = "BASE TABLE";
-    
     private final MySQLShowTablesStatement showTablesStatement;
     
     private final DatabaseType databaseType;
@@ -82,7 +80,7 @@ public final class ShowTablesExecutor implements 
DatabaseAdminQueryExecutor {
     
     private QueryResult getQueryResult(final String databaseName) {
         SystemDatabase systemDatabase = new SystemDatabase(databaseType);
-        if (!systemDatabase.getSystemSchemas().contains(databaseName) && 
!ProxyContext.getInstance().getDatabase(databaseName).isComplete()) {
+        if (!systemDatabase.getSystemSchemas().contains(databaseName) && 
!ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete())
 {
             return new RawMemoryQueryResult(queryResultMetaData, 
Collections.emptyList());
         }
         List<MemoryQueryResultDataRow> rows = 
getAllTableNames(databaseName).stream().map(each -> {
@@ -97,7 +95,7 @@ public final class ShowTablesExecutor implements 
DatabaseAdminQueryExecutor {
     }
     
     private Collection<ShardingSphereTable> getAllTableNames(final String 
databaseName) {
-        Collection<ShardingSphereTable> result = 
ProxyContext.getInstance().getDatabase(databaseName).getSchema(databaseName).getTables().values();
+        Collection<ShardingSphereTable> result = 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getSchema(databaseName).getTables().values();
         if (!showTablesStatement.getFilter().isPresent()) {
             return result;
         }
diff --git 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java
 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java
index d9a2790dc01..003cc34a59b 100644
--- 
a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java
+++ 
b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/UnicastResourceShowExecutor.java
@@ -75,7 +75,7 @@ public final class UnicastResourceShowExecutor implements 
DatabaseAdminQueryExec
     public void execute(final ConnectionSession connectionSession) throws 
SQLException {
         String originDatabase = connectionSession.getDatabaseName();
         String databaseName = null == originDatabase ? getFirstDatabaseName() 
: originDatabase;
-        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(databaseName).containsDataSource(),
 () -> new StorageUnitNotExistedException(databaseName));
+        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getContextManager().getDatabase(databaseName).containsDataSource(),
 () -> new StorageUnitNotExistedException(databaseName));
         try {
             connectionSession.setCurrentDatabase(databaseName);
             SQLStatementContext sqlStatementContext = new 
SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
@@ -95,7 +95,7 @@ public final class UnicastResourceShowExecutor implements 
DatabaseAdminQueryExec
         if (databaseNames.isEmpty()) {
             throw new NoDatabaseSelectedException();
         }
-        Optional<String> result = databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getDatabase(each).containsDataSource()).findFirst();
+        Optional<String> result = databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getContextManager().getDatabase(each).containsDataSource()).findFirst();
         ShardingSpherePreconditions.checkState(result.isPresent(), 
StorageUnitNotExistedException::new);
         return result.get();
     }
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
index 158205cec21..b05fc79bca5 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
@@ -269,7 +269,7 @@ class MySQLAdminExecutorCreatorTest {
         Map<String, ShardingSphereDatabase> result = 
Collections.singletonMap("db_0", database);
         initProxyContext(result);
         
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("db_0"));
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(database);
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("db_0")).thenReturn(database);
         MySQLSelectStatement selectStatement = 
mock(MySQLSelectStatement.class);
         when(selectStatement.getFrom()).thenReturn(null);
         ProjectionsSegment projectionsSegment = mock(ProjectionsSegment.class);
@@ -287,7 +287,7 @@ class MySQLAdminExecutorCreatorTest {
         Map<String, ShardingSphereDatabase> result = 
Collections.singletonMap("db_0", database);
         initProxyContext(result);
         
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("db_0"));
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(database);
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("db_0")).thenReturn(database);
         MySQLSelectStatement selectStatement = 
mock(MySQLSelectStatement.class);
         when(selectStatement.getFrom()).thenReturn(null);
         ProjectionsSegment projectionsSegment = mock(ProjectionsSegment.class);
@@ -323,7 +323,7 @@ class MySQLAdminExecutorCreatorTest {
         Optional<DatabaseAdminExecutor> actual = new 
MySQLAdminExecutorCreator().create(sqlStatementContext, "select SCHEMA_NAME 
from SCHEMATA", "information_schema", Collections.emptyList());
         assertTrue(actual.isPresent());
         assertThat(actual.get(), 
instanceOf(SelectInformationSchemataExecutor.class));
-        
when(ProxyContext.getInstance().getDatabase("information_schema").isComplete()).thenReturn(true);
+        
when(ProxyContext.getInstance().getContextManager().getDatabase("information_schema").isComplete()).thenReturn(true);
         actual = new MySQLAdminExecutorCreator().create(sqlStatementContext, 
"select SCHEMA_NAME from SCHEMATA", "information_schema", 
Collections.emptyList());
         assertFalse(actual.isPresent());
     }
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutorTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutorTest.java
index 76c0fb280ca..9d34ccd60c2 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutorTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutorTest.java
@@ -75,7 +75,6 @@ class ShowTablesExecutorTest {
         Map<String, ShardingSphereDatabase> databases = getDatabases();
         ContextManager contextManager = mockContextManager(databases);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(databases.get("db_0"));
         executor.execute(mockConnectionSession());
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         executor.getMergedResult().next();
@@ -97,7 +96,6 @@ class ShowTablesExecutorTest {
         Map<String, ShardingSphereDatabase> databases = getDatabases();
         ContextManager contextManager = mockContextManager(databases);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(databases.get("db_0"));
         executor.execute(mockConnectionSession());
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(2));
     }
@@ -112,7 +110,6 @@ class ShowTablesExecutorTest {
         Map<String, ShardingSphereDatabase> databases = getDatabases();
         ContextManager contextManager = mockContextManager(databases);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(databases.get("db_0"));
         executor.execute(mockConnectionSession());
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         executor.getMergedResult().next();
@@ -134,7 +131,6 @@ class ShowTablesExecutorTest {
         Map<String, ShardingSphereDatabase> databases = getDatabases();
         ContextManager contextManager = mockContextManager(databases);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(databases.get("db_0"));
         executor.execute(mockConnectionSession());
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         executor.getMergedResult().next();
@@ -152,7 +148,6 @@ class ShowTablesExecutorTest {
         Map<String, ShardingSphereDatabase> databases = getDatabases();
         ContextManager contextManager = mockContextManager(databases);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(databases.get("db_0"));
         executor.execute(mockConnectionSession());
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         executor.getMergedResult().next();
@@ -170,7 +165,6 @@ class ShowTablesExecutorTest {
         Map<String, ShardingSphereDatabase> databases = getDatabases();
         ContextManager contextManager = mockContextManager(databases);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase("db_0")).thenReturn(databases.get("db_0"));
         executor.execute(mockConnectionSession());
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         executor.getMergedResult().next();
@@ -202,6 +196,7 @@ class ShowTablesExecutorTest {
                 new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), new 
ConfigurationProperties(new Properties())));
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+        when(result.getDatabase("db_0")).thenReturn(databases.get("db_0"));
         return result;
     }
     
diff --git 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
index ef4696dcd2c..5fe08b1e86e 100644
--- 
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
+++ 
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutorTest.java
@@ -118,7 +118,6 @@ class SelectInformationSchemataExecutorTest {
             ContextManager contextManager = mockContextManager(database);
             
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
             
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("auth_db"));
-            
when(ProxyContext.getInstance().getDatabase("auth_db")).thenReturn(database);
             SelectInformationSchemataExecutor executor = new 
SelectInformationSchemataExecutor(statement, sql, Collections.emptyList());
             executor.execute(connectionSession);
             assertThat(executor.getQueryResultMetaData().getColumnCount(), 
is(2));
@@ -166,6 +165,9 @@ class SelectInformationSchemataExecutorTest {
                 
Arrays.stream(databases).collect(Collectors.toMap(ShardingSphereDatabase::getName,
 each -> each)),
                 mock(ResourceMetaData.class), new 
RuleMetaData(Collections.singleton(authorityRule)), new 
ConfigurationProperties(new Properties())));
         when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+        for (ShardingSphereDatabase each : databases) {
+            when(result.getDatabase(each.getName())).thenReturn(each);
+        }
         return result;
     }
     
diff --git 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
index b125e12cdb9..91c9daeeb80 100644
--- 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
+++ 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/Portal.java
@@ -91,7 +91,7 @@ public final class Portal {
         if (sqlStatementContext instanceof ParameterAware) {
             ((ParameterAware) sqlStatementContext).setUpParameters(params);
         }
-        DatabaseType protocolType = 
ProxyContext.getInstance().getDatabase(databaseName).getProtocolType();
+        DatabaseType protocolType = 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getProtocolType();
         QueryContext queryContext = new QueryContext(sqlStatementContext, 
preparedStatement.getSql(), params, preparedStatement.getHintValueContext(), 
true);
         
databaseConnectionManager.getConnectionSession().setQueryContext(queryContext);
         proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(protocolType, queryContext, 
databaseConnectionManager.getConnectionSession(), true);
diff --git 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
index c847dfec699..c2362173c7f 100644
--- 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
+++ 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutor.java
@@ -166,7 +166,7 @@ public final class PostgreSQLComDescribeExecutor implements 
CommandExecutor {
     }
     
     private ShardingSphereTable getTableFromMetaData(final String 
databaseName, final InsertStatement insertStatement, final String 
logicTableName) {
-        ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(databaseName);
+        ShardingSphereDatabase database = 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName);
         String schemaName = insertStatement.getTable().getOwner().map(optional 
-> optional.getIdentifier()
                 .getValue()).orElseGet(() -> new 
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName));
         return database.getSchema(schemaName).getTable(logicTableName);
@@ -241,7 +241,7 @@ public final class PostgreSQLComDescribeExecutor implements 
CommandExecutor {
         SQLStatementContext sqlStatementContext = new 
SQLBindEngine(metaDataContexts.getMetaData(), databaseName, 
logicPreparedStatement.getHintValueContext())
                 
.bind(logicPreparedStatement.getSqlStatementContext().getSqlStatement(), 
Collections.emptyList());
         QueryContext queryContext = new QueryContext(sqlStatementContext, 
logicPreparedStatement.getSql(), Collections.emptyList(), 
logicPreparedStatement.getHintValueContext());
-        ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(databaseName);
+        ShardingSphereDatabase database = 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName);
         ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(
                 queryContext, database, 
metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps(), 
connectionSession.getConnectionContext());
         ExecutionUnit executionUnitSample = 
executionContext.getExecutionUnits().iterator().next();
diff --git 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java
 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java
index 97e3734e45f..2a2093eb838 100644
--- 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java
+++ 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java
@@ -105,10 +105,9 @@ class PortalTest {
     
     @BeforeEach
     void setup() throws SQLException {
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         ShardingSphereDatabase database = mockDatabase();
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
+        ContextManager contextManager = mockContextManager(database);
+        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         ConnectionSession connectionSession = mock(ConnectionSession.class);
         when(connectionSession.getDefaultDatabaseName()).thenReturn("foo_db");
         
when(ProxyBackendHandlerFactory.newInstance(any(PostgreSQLDatabaseType.class), 
anyString(), any(SQLStatement.class), eq(connectionSession), 
any(HintValueContext.class)))
@@ -117,10 +116,11 @@ class PortalTest {
         
when(databaseConnectionManager.getConnectionSession()).thenReturn(connectionSession);
     }
     
-    private ContextManager mockContextManager() {
+    private ContextManager mockContextManager(final ShardingSphereDatabase 
database) {
         ContextManager result = mock(ContextManager.class, 
Answers.RETURNS_DEEP_STUBS);
         
when(result.getMetaDataContexts().getMetaData().containsDatabase("foo_db")).thenReturn(true);
         
when(result.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
+        when(result.getDatabase("foo_db")).thenReturn(database);
         return result;
     }
     
diff --git 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
index 7b46a4aad56..51df452d4f3 100644
--- 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
+++ 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
@@ -92,8 +92,8 @@ class PostgreSQLComBindExecutorTest {
         
when(bindPacket.readParameters(anyList())).thenReturn(Collections.emptyList());
         
when(bindPacket.readResultFormats()).thenReturn(Collections.emptyList());
         ContextManager contextManager = mock(ContextManager.class, 
Answers.RETURNS_DEEP_STUBS);
+        when(contextManager.getDatabase(databaseName)).thenReturn(database);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase(databaseName)).thenReturn(database);
         Collection<DatabasePacket> actual = executor.execute();
         assertThat(actual.size(), is(1));
         assertThat(actual.iterator().next(), 
is(PostgreSQLBindCompletePacket.getInstance()));
@@ -122,8 +122,8 @@ class PostgreSQLComBindExecutorTest {
         when(bindPacket.readParameters(anyList())).thenReturn(parameters);
         
when(bindPacket.readResultFormats()).thenReturn(Collections.emptyList());
         ContextManager contextManager = mock(ContextManager.class, 
Answers.RETURNS_DEEP_STUBS);
+        when(contextManager.getDatabase(databaseName)).thenReturn(database);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getDatabase(databaseName)).thenReturn(database);
         executor.execute();
         assertThat(connectionSession.getQueryContext().getParameters(), 
is(Arrays.asList(parameters.get(1), parameters.get(0))));
     }
diff --git 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
index 0a75c60f32b..ade2ec87a87 100644
--- 
a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
+++ 
b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
@@ -147,8 +147,6 @@ class PostgreSQLComDescribeExecutorTest {
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
-        
when(ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
         List<Integer> parameterIndexes = IntStream.range(0, 
sqlStatement.getParameterCount()).boxed().collect(Collectors.toList());
         
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
 new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, new 
HintValueContext(), parameterTypes,
                 parameterIndexes));
@@ -179,8 +177,6 @@ class PostgreSQLComDescribeExecutorTest {
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
-        
when(ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
         List<Integer> parameterIndexes = IntStream.range(0, 
sqlStatement.getParameterCount()).boxed().collect(Collectors.toList());
         
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
 new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, new 
HintValueContext(), parameterTypes,
                 parameterIndexes));
@@ -211,8 +207,6 @@ class PostgreSQLComDescribeExecutorTest {
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
-        
when(ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
         List<Integer> parameterIndexes = IntStream.range(0, 
sqlStatement.getParameterCount()).boxed().collect(Collectors.toList());
         
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
 new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, new 
HintValueContext(), parameterTypes,
                 parameterIndexes));
@@ -243,8 +237,6 @@ class PostgreSQLComDescribeExecutorTest {
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
-        
when(ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
         List<Integer> parameterIndexes = IntStream.range(0, 
sqlStatement.getParameterCount()).boxed().collect(Collectors.toList());
         
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
                 new PostgreSQLServerPreparedStatement(sql, 
sqlStatementContext, new HintValueContext(), parameterTypes, parameterIndexes));
@@ -267,8 +259,6 @@ class PostgreSQLComDescribeExecutorTest {
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
-        
when(ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
         List<Integer> parameterIndexes = IntStream.range(0, 
sqlStatement.getParameterCount()).boxed().collect(Collectors.toList());
         
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
 new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, new 
HintValueContext(), parameterTypes,
                 parameterIndexes));
@@ -349,8 +339,6 @@ class PostgreSQLComDescribeExecutorTest {
         List<PostgreSQLColumnType> parameterTypes = new 
ArrayList<>(Collections.singleton(PostgreSQLColumnType.UNSPECIFIED));
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
-        
when(ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
         List<Integer> parameterIndexes = IntStream.range(0, 
sqlStatement.getParameterCount()).boxed().collect(Collectors.toList());
         
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId,
                 new PostgreSQLServerPreparedStatement(sql, 
sqlStatementContext, new HintValueContext(), parameterTypes, parameterIndexes));
@@ -407,6 +395,8 @@ class PostgreSQLComDescribeExecutorTest {
         
when(result.getMetaDataContexts().getMetaData().containsDatabase(DATABASE_NAME)).thenReturn(true);
         
when(result.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).containsSchema("public")).thenReturn(true);
         
when(result.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).getSchema("public").containsTable(TABLE_NAME)).thenReturn(true);
+        ShardingSphereDatabase database = 
result.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
+        when(result.getDatabase(DATABASE_NAME)).thenReturn(database);
         return result;
     }
     

Reply via email to