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

zhaojinchao 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 d7685784862 Minor refactor DriverExecutorFacade and 
DriverExecuteBatchExecutor logic (#37968)
d7685784862 is described below

commit d7685784862b25bdd3128cb05f454719ba9f6fe9
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Feb 6 14:17:55 2026 +0800

    Minor refactor DriverExecutorFacade and DriverExecuteBatchExecutor logic 
(#37968)
---
 .../DriverExecuteBatchExecutor.java                  |  6 +++---
 .../executor/engine/facade/DriverExecutorFacade.java |  5 +++--
 .../statement/ShardingSpherePreparedStatement.java   |  7 +++----
 .../jdbc/core/statement/ShardingSphereStatement.java |  5 +++--
 .../sqlfederation/engine/SQLFederationEngine.java    | 20 +++++++++++++++++---
 .../proxy/backend/connector/ProxySQLExecutor.java    |  3 ++-
 .../header/query/QueryHeaderBuilderEngineTest.java   |  2 ++
 7 files changed, 33 insertions(+), 15 deletions(-)

diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java
index 5fb522bfd5a..23c0f7f4fe1 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/preparedstatement/DriverExecuteBatchExecutor.java
@@ -63,12 +63,12 @@ public final class DriverExecuteBatchExecutor {
     private ExecutionContext executionContext;
     
     public DriverExecuteBatchExecutor(final ShardingSphereConnection 
connection, final ShardingSphereMetaData metaData, final StatementOption 
statementOption, final StatementManager statementManager,
-                                      final ShardingSphereDatabase database) {
+                                      final ShardingSphereDatabase 
usedDatabase) {
         this.connection = connection;
         this.metaData = metaData;
         JDBCExecutor jdbcExecutor = new 
JDBCExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
-        batchPreparedStatementExecutor = new 
BatchPreparedStatementExecutor(database, jdbcExecutor, 
connection.getProcessId());
-        prepareEngine = createDriverExecutionPrepareEngine(statementOption, 
statementManager, database, metaData);
+        batchPreparedStatementExecutor = new 
BatchPreparedStatementExecutor(usedDatabase, jdbcExecutor, 
connection.getProcessId());
+        prepareEngine = createDriverExecutionPrepareEngine(statementOption, 
statementManager, usedDatabase, metaData);
     }
     
     private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
createDriverExecutionPrepareEngine(final StatementOption statementOption, final 
StatementManager statementManager,
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java
index a69e742126e..e743fce696a 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java
@@ -70,14 +70,15 @@ public final class DriverExecutorFacade implements 
AutoCloseable {
     
     private final DriverExecuteExecutor executeExecutor;
     
-    public DriverExecutorFacade(final ShardingSphereConnection connection, 
final StatementOption statementOption, final StatementManager statementManager, 
final JDBCDriverType jdbcDriverType) {
+    public DriverExecutorFacade(final ShardingSphereConnection connection, 
final StatementOption statementOption, final StatementManager statementManager, 
final JDBCDriverType jdbcDriverType,
+                                final ShardingSphereDatabase currentDatabase) {
         this.connection = connection;
         this.statementOption = statementOption;
         this.statementManager = statementManager;
         this.jdbcDriverType = jdbcDriverType;
         JDBCExecutor jdbcExecutor = new 
JDBCExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
         ShardingSphereMetaData metaData = 
connection.getContextManager().getMetaDataContexts().getMetaData();
-        String currentSchemaName = new 
DatabaseTypeRegistry(metaData.getDatabase(connection.getCurrentDatabaseName()).getProtocolType()).getDefaultSchemaName(connection.getCurrentDatabaseName());
+        String currentSchemaName = new 
DatabaseTypeRegistry(currentDatabase.getProtocolType()).getDefaultSchemaName(connection.getCurrentDatabaseName());
         sqlFederationEngine =
                 new SQLFederationEngine(connection.getCurrentDatabaseName(), 
currentSchemaName, metaData, 
connection.getContextManager().getMetaDataContexts().getStatistics(), 
jdbcExecutor);
         RawExecutor rawExecutor = new 
RawExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 578a42b3193..7dab5b2c5af 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.driver.jdbc.core.statement;
 import lombok.AccessLevel;
 import lombok.Getter;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.keygen.DialectGeneratedKeyOption;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.database.exception.core.SQLExceptionTransformEngine;
 import 
org.apache.shardingsphere.driver.executor.callback.add.StatementAddCallback;
@@ -140,8 +139,8 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         metaData = 
connection.getContextManager().getMetaDataContexts().getMetaData();
         sql = SQLHintUtils.removeHint(originSQL);
         hintValueContext = SQLHintUtils.extractHint(originSQL);
-        DatabaseType databaseType = 
metaData.getDatabase(connection.getCurrentDatabaseName()).getProtocolType();
-        SQLStatement sqlStatement = 
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class).getSQLParserEngine(databaseType).parse(sql,
 true);
+        ShardingSphereDatabase currentDatabase = 
metaData.getDatabase(connection.getCurrentDatabaseName());
+        SQLStatement sqlStatement = 
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class).getSQLParserEngine(currentDatabase.getProtocolType()).parse(sql,
 true);
         sqlStatementContext = new SQLBindEngine(metaData, 
connection.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement);
         String usedDatabaseName = 
sqlStatementContext.getTablesContext().getDatabaseName().orElse(connection.getCurrentDatabaseName());
         
connection.getDatabaseConnectionManager().getConnectionContext().setCurrentDatabaseName(connection.getCurrentDatabaseName());
@@ -150,7 +149,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         statementManager = new StatementManager();
         connection.getStatementManagers().add(statementManager);
         parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
-        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, JDBCDriverType.PREPARED_STATEMENT);
+        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, JDBCDriverType.PREPARED_STATEMENT, 
currentDatabase);
         executeBatchExecutor = new DriverExecuteBatchExecutor(connection, 
metaData, statementOption, statementManager, usedDatabase);
         statementsCacheable = isStatementsCacheable();
     }
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 510ef7e4405..840b9f22a93 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -102,7 +102,7 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         statementOption = new StatementOption(resultSetType, 
resultSetConcurrency, resultSetHoldability);
         statementManager = new StatementManager();
         connection.getStatementManagers().add(statementManager);
-        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, JDBCDriverType.STATEMENT);
+        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, JDBCDriverType.STATEMENT, 
metaData.getDatabase(connection.getCurrentDatabaseName()));
         batchStatementExecutor = new BatchStatementExecutor(this);
         statements = new LinkedList<>();
         usedDatabaseName = connection.getCurrentDatabaseName();
@@ -255,7 +255,8 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         ShardingSpherePreconditions.checkNotEmpty(originSQL, () -> new 
EmptySQLException().toSQLException());
         HintValueContext hintValueContext = 
SQLHintUtils.extractHint(originSQL);
         String sql = SQLHintUtils.removeHint(originSQL);
-        DatabaseType databaseType = 
metaData.getDatabase(usedDatabaseName).getProtocolType();
+        ShardingSphereDatabase currentDatabase = 
metaData.getDatabase(usedDatabaseName);
+        DatabaseType databaseType = currentDatabase.getProtocolType();
         SQLStatement sqlStatement = 
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class).getSQLParserEngine(databaseType).parse(sql,
 false);
         SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, 
connection.getCurrentDatabaseName(), hintValueContext).bind(sqlStatement);
         return new QueryContext(sqlStatementContext, sql, 
Collections.emptyList(), hintValueContext, 
connection.getDatabaseConnectionManager().getConnectionContext(), metaData);
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
index fabb160f964..5c3a7edeb69 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
@@ -95,7 +95,9 @@ public final class SQLFederationEngine implements 
AutoCloseable {
     private final ProcessEngine processEngine = new ProcessEngine();
     
     @SuppressWarnings("rawtypes")
-    private final Map<ShardingSphereRule, SQLFederationDecider> deciders;
+    private volatile Map<ShardingSphereRule, SQLFederationDecider> deciders;
+    
+    private final ShardingSphereMetaData metaData;
     
     private final String currentDatabaseName;
     
@@ -113,7 +115,7 @@ public final class SQLFederationEngine implements 
AutoCloseable {
     
     public SQLFederationEngine(final String currentDatabaseName, final String 
currentSchemaName, final ShardingSphereMetaData metaData,
                                final ShardingSphereStatistics statistics, 
final JDBCExecutor jdbcExecutor) {
-        deciders = OrderedSPILoader.getServices(SQLFederationDecider.class, 
metaData.getDatabase(currentDatabaseName).getRuleMetaData().getRules());
+        this.metaData = metaData;
         this.currentDatabaseName = currentDatabaseName;
         this.currentSchemaName = currentSchemaName;
         sqlFederationRule = 
metaData.getGlobalRuleMetaData().getSingleRule(SQLFederationRule.class);
@@ -129,6 +131,18 @@ public final class SQLFederationEngine implements 
AutoCloseable {
         return sqlFederationRule.getConfiguration().isSqlFederationEnabled();
     }
     
+    @SuppressWarnings("rawtypes")
+    private Map<ShardingSphereRule, SQLFederationDecider> getDeciders() {
+        if (null == deciders) {
+            synchronized (this) {
+                if (null == deciders) {
+                    deciders = 
OrderedSPILoader.getServices(SQLFederationDecider.class, 
metaData.getDatabase(currentDatabaseName).getRuleMetaData().getRules());
+                }
+            }
+        }
+        return deciders;
+    }
+    
     /**
      * Decide use SQL federation or not.
      *
@@ -152,7 +166,7 @@ public final class SQLFederationEngine implements 
AutoCloseable {
         }
         ShardingSphereDatabase usedDatabase = queryContext.getUsedDatabase();
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        for (Entry<ShardingSphereRule, SQLFederationDecider> entry : 
deciders.entrySet()) {
+        for (Entry<ShardingSphereRule, SQLFederationDecider> entry : 
getDeciders().entrySet()) {
             boolean isUseSQLFederation = 
entry.getValue().decide(sqlStatementContext, queryContext.getParameters(), 
globalRuleMetaData, usedDatabase, entry.getKey(), includedDataNodes);
             if (isUseSQLFederation) {
                 return true;
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 9c6fa638906..d1dec333dc9 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
@@ -114,7 +114,8 @@ public final class ProxySQLExecutor {
         String currentDatabaseName = 
Strings.isNullOrEmpty(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName())
                 ? 
databaseConnectionManager.getConnectionSession().getUsedDatabaseName()
                 : 
databaseConnectionManager.getConnectionSession().getCurrentDatabaseName();
-        String currentSchemaName = getSchemaName(sqlStatementContext, 
metaDataContexts.getMetaData().getDatabase(currentDatabaseName));
+        ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(currentDatabaseName);
+        String currentSchemaName = getSchemaName(sqlStatementContext, 
currentDatabase);
         sqlFederationEngine = new SQLFederationEngine(currentDatabaseName, 
currentSchemaName, metaDataContexts.getMetaData(), 
metaDataContexts.getStatistics(), jdbcExecutor);
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngineTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngineTest.java
index b40c68ecadc..639964f5f62 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngineTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/QueryHeaderBuilderEngineTest.java
@@ -63,6 +63,7 @@ class QueryHeaderBuilderEngineTest {
         Projection projection = mock(Projection.class);
         when(projection.getColumnName()).thenReturn("c1");
         when(projection.getColumnLabel()).thenReturn("l1");
+        when(projection.getExpression()).thenReturn("c1");
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, 
false, Collections.singleton(projection));
         QueryResultMetaData queryResultMetaData = 
mock(QueryResultMetaData.class);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
@@ -81,6 +82,7 @@ class QueryHeaderBuilderEngineTest {
         Projection projection = mock(Projection.class);
         when(projection.getColumnLabel()).thenReturn("label");
         when(projection.getColumnName()).thenReturn("column");
+        when(projection.getExpression()).thenReturn("column");
         ProjectionsContext projectionsContext = new ProjectionsContext(0, 0, 
false, Collections.singleton(projection));
         assertThrows(ColumnIndexOutOfRangeException.class, () -> new 
QueryHeaderBuilderEngine(databaseType).build(projectionsContext, mock(), 
mock(), 2));
     }

Reply via email to