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

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


The following commit(s) were added to refs/heads/master by this push:
     new adab8ca461c remove SQLStatementDatabaseHolder.java (#20115)
adab8ca461c is described below

commit adab8ca461cee06e260a9837e8022de237246a20
Author: Chuxin Chen <[email protected]>
AuthorDate: Mon Aug 22 10:04:08 2022 +0800

    remove SQLStatementDatabaseHolder.java (#20115)
    
    * remove SQLStatementDatabaseHolder.java
    
    * remove StatementDatabase holder.
    
    * remove StatementDatabase holder.
---
 .../shardingsphere/infra/binder/LogicSQL.java      | 25 +++++++++-
 .../driver/DriverExecutionPrepareEngine.java       | 11 ++++-
 .../prepare/driver/jdbc/DatabaseTypeAware.java}    | 25 ++++------
 .../statement/ShardingSpherePreparedStatement.java | 11 +++--
 .../core/statement/ShardingSphereStatement.java    |  5 +-
 .../backend/communication/ProxySQLExecutor.java    |  4 +-
 .../communication/ReactiveProxySQLExecutor.java    |  2 +-
 .../communication/SQLStatementDatabaseHolder.java  | 55 ----------------------
 .../jdbc/JDBCDatabaseCommunicationEngine.java      |  3 +-
 .../jdbc/statement/JDBCBackendStatement.java       |  9 ++--
 .../handler/ProxyBackendHandlerFactory.java        | 12 ++---
 .../handler/distsql/rul/sql/PreviewHandler.java    | 12 ++---
 .../proxy/backend/session/ConnectionSession.java   | 12 +++--
 .../jdbc/connection/JDBCBackendConnectionTest.java |  2 +-
 .../frontend/command/CommandExecutorTask.java      |  4 +-
 .../execute/MySQLComStmtExecuteExecutor.java       | 11 ++---
 .../text/query/MySQLMultiStatementsHandler.java    |  6 +--
 .../command/query/extended/JDBCPortal.java         |  5 +-
 .../PostgreSQLBatchedStatementsExecutor.java       |  7 +--
 .../command/ReactiveCommandExecuteTask.java        |  3 +-
 .../ReactiveMySQLComStmtExecuteExecutor.java       | 15 ++----
 21 files changed, 97 insertions(+), 142 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/LogicSQL.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/LogicSQL.java
index 410f4f7fdeb..26e086b8eff 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/LogicSQL.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/LogicSQL.java
@@ -18,15 +18,16 @@
 package org.apache.shardingsphere.infra.binder;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.type.TableAvailable;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Logic SQL.
  */
-@RequiredArgsConstructor
 @Getter
 public final class LogicSQL {
     
@@ -35,4 +36,24 @@ public final class LogicSQL {
     private final String sql;
     
     private final List<Object> parameters;
+    
+    private String sqlStatementDatabaseName;
+    
+    public LogicSQL(final SQLStatementContext<?> sqlStatementContext, final 
String sql, final List<Object> parameters) {
+        this.sqlStatementContext = sqlStatementContext;
+        this.sql = sql;
+        this.parameters = parameters;
+        if (sqlStatementContext instanceof TableAvailable) {
+            Optional.ofNullable(((TableAvailable) 
sqlStatementContext).getTablesContext()).flatMap(TablesContext::getDatabaseName).ifPresent(databaseName
 -> sqlStatementDatabaseName = databaseName);
+        }
+    }
+    
+    /**
+     * Get sql statement database name.
+     * 
+     * @return database name
+     */
+    public Optional<String> getSqlStatementDatabaseName() {
+        return Optional.ofNullable(sqlStatementDatabaseName);
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java
index e3a07595bed..32743e1b6d8 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java
@@ -17,12 +17,14 @@
 
 package org.apache.shardingsphere.infra.executor.sql.prepare.driver;
 
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroup;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.DriverExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.AbstractExecutionPrepareEngine;
+import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.DatabaseTypeAware;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
 import java.sql.SQLException;
@@ -52,13 +54,17 @@ public final class DriverExecutionPrepareEngine<T extends 
DriverExecutionUnit<?>
     @SuppressWarnings("rawtypes")
     private final SQLExecutionUnitBuilder sqlExecutionUnitBuilder;
     
+    private final DatabaseType databaseType;
+    
     public DriverExecutionPrepareEngine(final String type, final int 
maxConnectionsSizePerQuery, final ExecutorConnectionManager<C> 
connectionManager,
-                                        final ExecutorStatementManager<C, ?, 
?> statementManager, final StorageResourceOption option, final 
Collection<ShardingSphereRule> rules) {
+                                        final ExecutorStatementManager<C, ?, 
?> statementManager, final StorageResourceOption option, final 
Collection<ShardingSphereRule> rules,
+                                        final DatabaseType databaseType) {
         super(maxConnectionsSizePerQuery, rules);
         this.connectionManager = connectionManager;
         this.statementManager = statementManager;
         this.option = option;
         sqlExecutionUnitBuilder = getCachedSqlExecutionUnitBuilder(type);
+        this.databaseType = databaseType;
     }
     
     /**
@@ -91,6 +97,9 @@ public final class DriverExecutionPrepareEngine<T extends 
DriverExecutionUnit<?>
     private ExecutionGroup<T> createExecutionGroup(final String 
dataSourceName, final List<SQLUnit> sqlUnits, final C connection, final 
ConnectionMode connectionMode) throws SQLException {
         List<T> result = new LinkedList<>();
         for (SQLUnit each : sqlUnits) {
+            if (statementManager instanceof DatabaseTypeAware) {
+                ((DatabaseTypeAware) 
statementManager).setDatabaseType(databaseType);
+            }
             result.add((T) sqlExecutionUnitBuilder.build(new 
ExecutionUnit(dataSourceName, each), statementManager, connection, 
connectionMode, option));
         }
         return new ExecutionGroup<>(result);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/LogicSQL.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/jdbc/DatabaseTypeAware.java
similarity index 65%
copy from 
shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/LogicSQL.java
copy to 
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/jdbc/DatabaseTypeAware.java
index 410f4f7fdeb..933d39f180a 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/LogicSQL.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/jdbc/DatabaseTypeAware.java
@@ -15,24 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.binder;
+package org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-
-import java.util.List;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 
 /**
- * Logic SQL.
+ * Database type aware.
  */
-@RequiredArgsConstructor
-@Getter
-public final class LogicSQL {
-    
-    private final SQLStatementContext<?> sqlStatementContext;
-    
-    private final String sql;
+public interface DatabaseTypeAware {
     
-    private final List<Object> parameters;
+    /**
+     * Set database type.
+     * 
+     * @param databaseType database type
+     */
+    void setDatabaseType(DatabaseType databaseType);
 }
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index c70d92c0fc8..96797a70de0 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -304,7 +304,8 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
createDriverExecutionPrepareEngine() {
         int maxConnectionsSizePerQuery = 
metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY);
         return new 
DriverExecutionPrepareEngine<>(JDBCDriverType.PREPARED_STATEMENT, 
maxConnectionsSizePerQuery, connection.getConnectionManager(), statementManager,
-                statementOption, 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules());
+                statementOption, 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules(),
+                
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getResource().getDatabaseType());
     }
     
     @Override
@@ -595,9 +596,11 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     }
     
     private void initBatchPreparedStatementExecutor() throws SQLException {
-        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(
-                JDBCDriverType.PREPARED_STATEMENT, 
metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY),
-                connection.getConnectionManager(), statementManager, 
statementOption, 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules());
+        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new 
DriverExecutionPrepareEngine<>(JDBCDriverType.PREPARED_STATEMENT, 
metaDataContexts.getMetaData().getProps()
+                
.<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY), 
connection.getConnectionManager(), statementManager, statementOption,
+                metaDataContexts.getMetaData()
+                        
.getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules(),
+                
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getResource().getDatabaseType());
         List<ExecutionUnit> executionUnits = new 
ArrayList<>(batchPreparedStatementExecutor.getBatchExecutionUnits().size());
         for (BatchExecutionUnit each : 
batchPreparedStatementExecutor.getBatchExecutionUnits()) {
             ExecutionUnit executionUnit = each.getExecutionUnit();
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index f97612f5607..8ddfa561eed 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -229,8 +229,9 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     
     private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
createDriverExecutionPrepareEngine() {
         int maxConnectionsSizePerQuery = 
metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY);
-        return new DriverExecutionPrepareEngine<>(JDBCDriverType.STATEMENT, 
maxConnectionsSizePerQuery, connection.getConnectionManager(), statementManager,
-                statementOption, 
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules());
+        return new DriverExecutionPrepareEngine<>(JDBCDriverType.STATEMENT, 
maxConnectionsSizePerQuery, connection.getConnectionManager(), 
statementManager, statementOption,
+                
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData().getRules(),
+                
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getResource().getDatabaseType());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
index fec9ee0bd32..779434763fc 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
@@ -180,8 +180,8 @@ public final class ProxySQLExecutor {
     private List<ExecuteResult> useDriverToExecute(final ExecutionContext 
executionContext, final Collection<ShardingSphereRule> rules,
                                                    final int 
maxConnectionsSizePerQuery, final boolean isReturnGeneratedKeys, final boolean 
isExceptionThrown) throws SQLException {
         JDBCBackendStatement statementManager = (JDBCBackendStatement) 
backendConnection.getConnectionSession().getStatementManager();
-        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(
-                type, maxConnectionsSizePerQuery, backendConnection, 
statementManager, new StatementOption(isReturnGeneratedKeys), rules);
+        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(type, 
maxConnectionsSizePerQuery, backendConnection, statementManager,
+                new StatementOption(isReturnGeneratedKeys), rules, 
backendConnection.getConnectionSession().getDatabaseType());
         ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext;
         try {
             executionGroupContext = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits());
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ReactiveProxySQLExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ReactiveProxySQLExecutor.java
index 68d9aad2647..2f93b1a7a61 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ReactiveProxySQLExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ReactiveProxySQLExecutor.java
@@ -124,7 +124,7 @@ public final class ReactiveProxySQLExecutor {
                                                            final int 
maxConnectionsSizePerQuery) throws SQLException {
         VertxBackendStatement statementManager = (VertxBackendStatement) 
backendConnection.getConnectionSession().getStatementManager();
         DriverExecutionPrepareEngine<VertxExecutionUnit, Future<? extends 
SqlClient>> prepareEngine = new DriverExecutionPrepareEngine<>(
-                TYPE, maxConnectionsSizePerQuery, backendConnection, 
statementManager, new VertxExecutionContext(), rules);
+                TYPE, maxConnectionsSizePerQuery, backendConnection, 
statementManager, new VertxExecutionContext(), rules, 
backendConnection.getConnectionSession().getDatabaseType());
         ExecutionGroupContext<VertxExecutionUnit> executionGroupContext;
         try {
             executionGroupContext = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits());
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/SQLStatementDatabaseHolder.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/SQLStatementDatabaseHolder.java
deleted file mode 100644
index ffa01c436f0..00000000000
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/SQLStatementDatabaseHolder.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.proxy.backend.communication;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
-/**
- * Hold SQL statement database for current thread.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class SQLStatementDatabaseHolder {
-    
-    private static final ThreadLocal<String> SQL_STATEMENT_DATABASE = new 
ThreadLocal<>();
-    
-    /**
-     * Set SQL statement database.
-     *
-     * @param database SQL statement database
-     */
-    public static void set(final String database) {
-        SQL_STATEMENT_DATABASE.set(database);
-    }
-    
-    /**
-     * Get SQL statement database.
-     *
-     * @return SQL statement database
-     */
-    public static String get() {
-        return SQL_STATEMENT_DATABASE.get();
-    }
-    
-    /**
-     * Remove SQL statement database.
-     */
-    public static void remove() {
-        SQL_STATEMENT_DATABASE.remove();
-    }
-}
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 48eada840f6..b4057496519 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
@@ -169,7 +169,8 @@ public final class JDBCDatabaseCommunicationEngine extends 
DatabaseCommunication
         int maxConnectionsSizePerQuery = 
metaData.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY);
         JDBCBackendStatement statementManager = (JDBCBackendStatement) 
backendConnection.getConnectionSession().getStatementManager();
         return new DriverExecutionPrepareEngine<>(getDriverType(), 
maxConnectionsSizePerQuery, backendConnection, statementManager,
-                new StatementOption(isReturnGeneratedKeys), 
metaData.getMetaData().getDatabase(backendConnection.getConnectionSession().getDatabaseName()).getRuleMetaData().getRules());
+                new StatementOption(isReturnGeneratedKeys), 
metaData.getMetaData().getDatabase(backendConnection.getConnectionSession().getDatabaseName()).getRuleMetaData().getRules(),
+                backendConnection.getConnectionSession().getDatabaseType());
     }
     
     private ResponseHeader processExecuteFederation(final ResultSet resultSet, 
final MetaDataContexts metaDataContexts) throws SQLException {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/statement/JDBCBackendStatement.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/statement/JDBCBackendStatement.java
index e3f104ae432..82d19818a8c 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/statement/JDBCBackendStatement.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/statement/JDBCBackendStatement.java
@@ -23,10 +23,9 @@ import 
org.apache.shardingsphere.db.protocol.parameter.TypeUnspecifiedSQLParamet
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
+import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.DatabaseTypeAware;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.ExecutorJDBCStatementManager;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -41,9 +40,9 @@ import java.util.Optional;
  */
 @Getter
 @Setter
-public final class JDBCBackendStatement implements 
ExecutorJDBCStatementManager {
+public final class JDBCBackendStatement implements 
ExecutorJDBCStatementManager, DatabaseTypeAware {
     
-    private String databaseName;
+    private DatabaseType databaseType;
     
     @Override
     public Statement createStorageResource(final Connection connection, final 
ConnectionMode connectionMode, final StatementOption option) throws 
SQLException {
@@ -76,8 +75,6 @@ public final class JDBCBackendStatement implements 
ExecutorJDBCStatementManager
     }
     
     private void setFetchSize(final Statement statement) throws SQLException {
-        DatabaseType databaseType = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts()
-                .getMetaData().getDatabase(null == databaseName ? 
SQLStatementDatabaseHolder.get() : 
databaseName).getResource().getDatabaseType();
         Optional<StatementMemoryStrictlyFetchSizeSetter> fetchSizeSetter = 
StatementMemoryStrictlyFetchSizeSetterFactory.findInstance(databaseType.getType());
         if (fetchSizeSetter.isPresent()) {
             fetchSizeSetter.get().setFetchSize(statement);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
index 56f50705594..ba57c0c6709 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
@@ -27,13 +27,12 @@ import 
org.apache.shardingsphere.distsql.parser.statement.rul.RULStatement;
 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.binder.type.TableAvailable;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.check.SQLCheckEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.DatabaseAdminBackendHandlerFactory;
 import 
org.apache.shardingsphere.proxy.backend.handler.data.DatabaseBackendHandlerFactory;
@@ -43,7 +42,6 @@ import 
org.apache.shardingsphere.proxy.backend.handler.extra.ExtraProxyBackendHa
 import org.apache.shardingsphere.proxy.backend.handler.skip.SkipBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.transaction.TransactionBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.infra.util.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.FlushStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.DCLStatement;
@@ -112,7 +110,9 @@ public final class ProxyBackendHandlerFactory {
         }
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabases(),
                 sqlStatement, connectionSession.getDefaultDatabaseName());
-        return newInstance(databaseType, new LogicSQL(sqlStatementContext, 
sql, Collections.emptyList()), connectionSession, false);
+        LogicSQL logicSQL = new LogicSQL(sqlStatementContext, sql, 
Collections.emptyList());
+        connectionSession.setLogicSQL(logicSQL);
+        return newInstance(databaseType, logicSQL, connectionSession, false);
     }
     
     /**
@@ -139,10 +139,6 @@ public final class ProxyBackendHandlerFactory {
         if (backendHandler.isPresent()) {
             return backendHandler.get();
         }
-        // TODO optimize SQLStatementDatabaseHolder
-        if (sqlStatementContext instanceof TableAvailable) {
-            ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseName().ifPresent(SQLStatementDatabaseHolder::set);
-        }
         Optional<ExtraProxyBackendHandler> extraHandler = 
findExtraProxyBackendHandler(sqlStatement);
         if (extraHandler.isPresent()) {
             return extraHandler.get();
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
index 17eda968213..fe59917334b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
@@ -28,7 +28,6 @@ import 
org.apache.shardingsphere.infra.binder.decider.engine.SQLFederationDecide
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementContext;
 import org.apache.shardingsphere.infra.binder.type.CursorAvailable;
-import org.apache.shardingsphere.infra.binder.type.TableAvailable;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.context.kernel.KernelProcessor;
@@ -60,7 +59,6 @@ import 
org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.JDBCBackendStatement;
 import org.apache.shardingsphere.proxy.backend.context.BackendExecutorContext;
@@ -103,10 +101,8 @@ public final class PreviewHandler extends 
SQLRULBackendHandler<PreviewStatement>
         SQLParserRule sqlParserRule = 
globalRuleMetaData.getSingleRule(SQLParserRule.class);
         SQLStatement previewedStatement = 
sqlParserRule.getSQLParserEngine(databaseType).parse(getSqlStatement().getSql(),
 false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 previewedStatement, databaseName);
-        // TODO optimize SQLStatementDatabaseHolder
-        if (sqlStatementContext instanceof TableAvailable) {
-            ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseName().ifPresent(SQLStatementDatabaseHolder::set);
-        }
+        LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
getSqlStatement().getSql(), Collections.emptyList());
+        getConnectionSession().setLogicSQL(logicSQL);
         if (sqlStatementContext instanceof CursorAvailable && 
sqlStatementContext instanceof CursorDefinitionAware) {
             setUpCursorDefinition(sqlStatementContext);
         }
@@ -114,7 +110,6 @@ public final class PreviewHandler extends 
SQLRULBackendHandler<PreviewStatement>
         if (!database.isComplete()) {
             throw new RuleNotExistedException();
         }
-        LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
getSqlStatement().getSql(), Collections.emptyList());
         ConfigurationProperties props = 
metaDataContexts.getMetaData().getProps();
         SQLFederationDeciderContext deciderContext = decide(logicSQL, props, 
metaDataContexts.getMetaData().getDatabase(getConnectionSession().getDatabaseName()));
         Collection<ExecutionUnit> executionUnits = 
deciderContext.isUseSQLFederation() ? getFederationExecutionUnits(logicSQL, 
databaseName, metaDataContexts)
@@ -175,7 +170,8 @@ public final class PreviewHandler extends 
SQLRULBackendHandler<PreviewStatement>
         int maxConnectionsSizePerQuery = 
metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY);
         return new DriverExecutionPrepareEngine<>(JDBCDriverType.STATEMENT, 
maxConnectionsSizePerQuery, (JDBCBackendConnection) 
getConnectionSession().getBackendConnection(),
                 (JDBCBackendStatement) 
getConnectionSession().getStatementManager(), new 
StatementOption(isReturnGeneratedKeys),
-                
metaDataContexts.getMetaData().getDatabase(getDatabaseName()).getRuleMetaData().getRules());
+                
metaDataContexts.getMetaData().getDatabase(getDatabaseName()).getRuleMetaData().getRules(),
+                
metaDataContexts.getMetaData().getDatabase(getDatabaseName()).getResource().getDatabaseType());
     }
     
     private String getDatabaseName() {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
index a86edd93b10..25904d9b5be 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java
@@ -21,13 +21,13 @@ import io.netty.util.AttributeMap;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.ExecutorStatementManager;
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.infra.session.ConnectionContext;
 import org.apache.shardingsphere.proxy.backend.communication.BackendConnection;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.JDBCBackendStatement;
 import 
org.apache.shardingsphere.proxy.backend.communication.vertx.VertxBackendConnection;
@@ -37,6 +37,8 @@ import 
org.apache.shardingsphere.proxy.backend.session.transaction.TransactionSt
 import 
org.apache.shardingsphere.sql.parser.sql.common.constant.TransactionIsolationLevel;
 import org.apache.shardingsphere.transaction.core.TransactionType;
 
+import java.util.Optional;
+
 /**
  * Connection session.
  */
@@ -73,6 +75,9 @@ public final class ConnectionSession {
     
     private final ConnectionContext connectionContext;
     
+    // TODO rename to QueryContext
+    private LogicSQL logicSQL;
+    
     private final RequiredSessionVariableRecorder 
requiredSessionVariableRecorder = new RequiredSessionVariableRecorder();
     
     public ConnectionSession(final DatabaseType databaseType, final 
TransactionType initialTransactionType, final AttributeMap attributeMap) {
@@ -103,9 +108,6 @@ public final class ConnectionSession {
         if (null != databaseName && databaseName.equals(this.databaseName)) {
             return;
         }
-        if (statementManager instanceof JDBCBackendStatement) {
-            ((JDBCBackendStatement) 
statementManager).setDatabaseName(databaseName);
-        }
         this.databaseName = databaseName;
     }
     
@@ -115,7 +117,7 @@ public final class ConnectionSession {
      * @return database name
      */
     public String getDatabaseName() {
-        return null == SQLStatementDatabaseHolder.get() ? databaseName : 
SQLStatementDatabaseHolder.get();
+        return 
Optional.ofNullable(logicSQL).flatMap(LogicSQL::getSqlStatementDatabaseName).orElse(databaseName);
     }
     
     /**
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/connection/JDBCBackendConnectionTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/connection/JDBCBackendConnectionTest.java
index 1b3207bfa6f..c425376a574 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/connection/JDBCBackendConnectionTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/connection/JDBCBackendConnectionTest.java
@@ -101,7 +101,7 @@ public final class JDBCBackendConnectionTest extends 
ProxyContextRestorer {
         
when(connectionSession.getBackendConnection()).thenReturn(backendConnection);
         when(connectionSession.getTransactionStatus()).thenReturn(new 
TransactionStatus(TransactionType.LOCAL));
         JDBCBackendStatement backendStatement = new JDBCBackendStatement();
-        backendStatement.setDatabaseName(connectionSession.getDatabaseName());
+        backendStatement.setDatabaseType(connectionSession.getDatabaseType());
         
when(connectionSession.getStatementManager()).thenReturn(backendStatement);
         
when(connectionSession.getRequiredSessionVariableRecorder()).thenReturn(new 
RequiredSessionVariableRecorder());
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
index daf2e85b5cd..ad30e31fc1d 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-core/src/main/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTask.java
@@ -28,7 +28,6 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.db.protocol.payload.PacketPayload;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSphereInsideException;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.exception.BackendConnectionException;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -85,8 +84,7 @@ public final class CommandExecutorTask implements Runnable {
             // CHECKSTYLE:ON
             processException(new RuntimeException(error));
         } finally {
-            // TODO optimize SQLStatementDatabaseHolder
-            SQLStatementDatabaseHolder.remove();
+            connectionSession.setLogicSQL(null);
             Collection<SQLException> exceptions = Collections.emptyList();
             try {
                 
connectionSession.getBackendConnection().closeExecutionResources();
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
index dfc97c799f4..fbb82665745 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
@@ -31,17 +31,15 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.aware.ParameterAware;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.binder.type.TableAvailable;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
+import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
+import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
-import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
 import 
org.apache.shardingsphere.proxy.frontend.command.executor.QueryCommandExecutor;
 import org.apache.shardingsphere.proxy.frontend.command.executor.ResponseType;
 import 
org.apache.shardingsphere.proxy.frontend.mysql.command.ServerStatusFlagCalculator;
@@ -79,11 +77,8 @@ public final class MySQLComStmtExecuteExecutor implements 
QueryCommandExecutor {
         if (sqlStatementContext instanceof ParameterAware) {
             ((ParameterAware) sqlStatementContext).setUpParameters(parameters);
         }
-        // TODO optimize SQLStatementDatabaseHolder
-        if (sqlStatementContext instanceof TableAvailable) {
-            ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseName().ifPresent(SQLStatementDatabaseHolder::set);
-        }
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
preparedStatement.getSql(), parameters);
+        connectionSession.setLogicSQL(logicSQL);
         proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(DatabaseTypeFactory.getInstance("MySQL"),
 logicSQL, connectionSession, true);
         ResponseHeader responseHeader = proxyBackendHandler.execute();
         return responseHeader instanceof QueryResponseHeader ? 
processQuery((QueryResponseHeader) responseHeader) : 
processUpdate((UpdateResponseHeader) responseHeader);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
index de107667149..0335fcadbc2 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
@@ -137,9 +137,9 @@ public final class MySQLMultiStatementsHandler implements 
ProxyBackendHandler {
     @Override
     public ResponseHeader execute() throws SQLException {
         Collection<ShardingSphereRule> rules = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName()).getRuleMetaData().getRules();
-        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(
-                JDBCDriverType.STATEMENT, 
metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY),
-                (JDBCBackendConnection) 
connectionSession.getBackendConnection(), (JDBCBackendStatement) 
connectionSession.getStatementManager(), new StatementOption(false), rules);
+        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(JDBCDriverType.STATEMENT, 
metaDataContexts.getMetaData().getProps()
+                
.<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY), 
(JDBCBackendConnection) connectionSession.getBackendConnection(),
+                (JDBCBackendStatement) 
connectionSession.getStatementManager(), new StatementOption(false), rules, 
connectionSession.getDatabaseType());
         ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
prepareEngine.prepare(anyExecutionContext.getRouteContext(), 
samplingExecutionUnit());
         for (ExecutionGroup<JDBCExecutionUnit> eachGroup : 
executionGroupContext.getInputGroups()) {
             for (JDBCExecutionUnit each : eachGroup.getInputs()) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java
index 8a04bffce47..ad706389248 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/JDBCPortal.java
@@ -40,14 +40,14 @@ import 
org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
+import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
-import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
-import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
 import 
org.apache.shardingsphere.proxy.frontend.postgresql.command.query.PostgreSQLCommand;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableAssignSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -98,6 +98,7 @@ public final class JDBCPortal implements Portal<Void> {
         }
         DatabaseType databaseType = getDatabaseType(databaseName);
         LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
preparedStatement.getSql(), parameters);
+        backendConnection.getConnectionSession().setLogicSQL(logicSQL);
         proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(databaseType, logicSQL, 
backendConnection.getConnectionSession(), true);
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index bffd2761113..54e01d6b2b7 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -145,9 +145,10 @@ public final class PostgreSQLBatchedStatementsExecutor {
     
     private void addBatchedParametersToPreparedStatements() throws 
SQLException {
         Collection<ShardingSphereRule> rules = 
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName()).getRuleMetaData().getRules();
-        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(
-                JDBCDriverType.PREPARED_STATEMENT, 
metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY),
-                (JDBCBackendConnection) 
connectionSession.getBackendConnection(), (JDBCBackendStatement) 
connectionSession.getStatementManager(), new StatementOption(false), rules);
+        DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new 
DriverExecutionPrepareEngine<>(JDBCDriverType.PREPARED_STATEMENT,
+                
metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY),
+                (JDBCBackendConnection) 
connectionSession.getBackendConnection(), (JDBCBackendStatement) 
connectionSession.getStatementManager(),
+                new StatementOption(false), rules, 
connectionSession.getDatabaseType());
         executionGroupContext = 
prepareEngine.prepare(anyExecutionContext.getRouteContext(), 
executionUnitParameters.keySet());
         for (ExecutionGroup<JDBCExecutionUnit> eachGroup : 
executionGroupContext.getInputGroups()) {
             for (JDBCExecutionUnit each : eachGroup.getInputs()) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-core/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/command/ReactiveCommandExecuteTask.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-core/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/command/ReactiveCommandExecuteTask.java
index 5c76fcc75a8..9c97a080fc0 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-core/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/command/ReactiveCommandExecuteTask.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-core/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/command/ReactiveCommandExecuteTask.java
@@ -29,7 +29,6 @@ import 
org.apache.shardingsphere.db.protocol.packet.CommandPacket;
 import org.apache.shardingsphere.db.protocol.packet.CommandPacketType;
 import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.db.protocol.payload.PacketPayload;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
 import 
org.apache.shardingsphere.proxy.backend.exception.BackendConnectionException;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.proxy.frontend.command.CommandExecuteEngine;
@@ -102,7 +101,7 @@ public final class ReactiveCommandExecuteTask implements 
Runnable {
         } catch (final Exception ignored) {
             // CHECKSTYLE:ON
         }
-        SQLStatementDatabaseHolder.remove();
+        connectionSession.setLogicSQL(null);
         return ((Future<Void>) 
connectionSession.getBackendConnection().closeExecutionResources()).onComplete(this::doFlushIfNecessary);
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
index 563370586fa..14e41440a66 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
@@ -34,22 +34,20 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.aware.ParameterAware;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.binder.type.TableAvailable;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import org.apache.shardingsphere.infra.executor.check.SQLCheckEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
-import 
org.apache.shardingsphere.proxy.backend.communication.SQLStatementDatabaseHolder;
 import 
org.apache.shardingsphere.proxy.backend.communication.vertx.VertxDatabaseCommunicationEngine;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
+import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
-import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.frontend.command.executor.ResponseType;
 import 
org.apache.shardingsphere.proxy.frontend.mysql.command.ServerStatusFlagCalculator;
 import 
org.apache.shardingsphere.proxy.frontend.mysql.command.query.binary.MySQLPreparedStatement;
@@ -94,10 +92,8 @@ public final class ReactiveMySQLComStmtExecuteExecutor 
implements ReactiveComman
         if (sqlStatementContext instanceof ParameterAware) {
             ((ParameterAware) sqlStatementContext).setUpParameters(parameters);
         }
-        // TODO optimize SQLStatementDatabaseHolder
-        if (sqlStatementContext instanceof TableAvailable) {
-            ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseName().ifPresent(SQLStatementDatabaseHolder::set);
-        }
+        LogicSQL logicSQL = new LogicSQL(sqlStatementContext, 
preparedStatement.getSql(), parameters);
+        connectionSession.setLogicSQL(logicSQL);
         SQLStatement sqlStatement = preparedStatement.getSqlStatement();
         String databaseName = connectionSession.getDatabaseName();
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
@@ -107,8 +103,7 @@ public final class ReactiveMySQLComStmtExecuteExecutor 
implements ReactiveComman
         if (sqlStatement instanceof TCLStatement) {
             proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(DatabaseTypeFactory.getInstance("MySQL"),
 preparedStatement.getSql(), sqlStatement, connectionSession);
         } else {
-            databaseCommunicationEngine = 
DatabaseCommunicationEngineFactory.getInstance()
-                    .newDatabaseCommunicationEngine(new 
LogicSQL(sqlStatementContext, preparedStatement.getSql(), parameters), 
connectionSession.getBackendConnection(), true);
+            databaseCommunicationEngine = 
DatabaseCommunicationEngineFactory.getInstance().newDatabaseCommunicationEngine(logicSQL,
 connectionSession.getBackendConnection(), true);
         }
         return (null != databaseCommunicationEngine ? 
databaseCommunicationEngine.executeFuture() : 
proxyBackendHandler.executeFuture()).compose(responseHeader -> {
             Collection<DatabasePacket<?>> headerPackets = responseHeader 
instanceof QueryResponseHeader ? processQuery((QueryResponseHeader) 
responseHeader, characterSet)

Reply via email to