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));
}