This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 af4fa095dce Refactor FederationMetaDataRefreshEngine (#37196)
af4fa095dce is described below
commit af4fa095dce1560e81fd6862ac3c872b000d16a6
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Nov 27 16:13:40 2025 +0800
Refactor FederationMetaDataRefreshEngine (#37196)
* Refactor FederationMetaDataRefreshEngine
* Refactor FederationMetaDataRefreshEngine
---
.../executor/engine/DriverExecuteExecutor.java | 7 ++--
.../FederationMetaDataRefreshEngine.java | 41 +++++++++++-----------
.../connector/StandardDatabaseProxyConnector.java | 8 ++---
3 files changed, 27 insertions(+), 29 deletions(-)
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java
index a93bc6be652..902fa0d2420 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java
@@ -100,10 +100,9 @@ public final class DriverExecuteExecutor {
new
ExecuteQueryCallbackFactory(prepareEngine.getType()).newInstance(database,
queryContext), new SQLFederationContext(false, queryContext, metaData,
connection.getProcessId()));
return null != resultSet;
}
- FederationMetaDataRefreshEngine federationMetaDataRefreshEngine = new
FederationMetaDataRefreshEngine(
-
connection.getContextManager().getPersistServiceFacade().getModeFacade().getMetaDataManagerService(),
database);
- if (sqlFederationEngine.isSqlFederationEnabled() &&
federationMetaDataRefreshEngine.isNeedRefresh(queryContext.getSqlStatementContext()))
{
-
federationMetaDataRefreshEngine.refresh(queryContext.getSqlStatementContext());
+ FederationMetaDataRefreshEngine federationMetaDataRefreshEngine = new
FederationMetaDataRefreshEngine(queryContext.getSqlStatementContext());
+ if (sqlFederationEngine.isSqlFederationEnabled() &&
federationMetaDataRefreshEngine.isNeedRefresh()) {
+
federationMetaDataRefreshEngine.refresh(connection.getContextManager().getPersistServiceFacade().getModeFacade().getMetaDataManagerService(),
database);
return true;
}
if (transactionExecutor.decide(queryContext)) {
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
index 10a18249666..74640a5be73 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.mode.metadata.refresher.federation;
-import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -29,40 +28,42 @@ import java.util.Optional;
/**
* Federation meta data refresh engine.
*/
-@RequiredArgsConstructor
public final class FederationMetaDataRefreshEngine {
- private final MetaDataManagerPersistService metaDataManagerPersistService;
+ private final SQLStatementContext sqlStatementContext;
- private final ShardingSphereDatabase database;
+ @SuppressWarnings("rawtypes")
+ private final FederationMetaDataRefresher refresher;
+
+ public FederationMetaDataRefreshEngine(final SQLStatementContext
sqlStatementContext) {
+ this.sqlStatementContext = sqlStatementContext;
+ refresher = findFederationMetaDataRefresher().orElse(null);
+ }
+
+ @SuppressWarnings("rawtypes")
+ private Optional<FederationMetaDataRefresher>
findFederationMetaDataRefresher() {
+ Optional<FederationMetaDataRefresher> refresher =
TypedSPILoader.findService(FederationMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass());
+ return refresher.isPresent() ? refresher :
TypedSPILoader.findService(FederationMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass().getSuperclass());
+ }
/**
* Whether to need refresh meta data.
*
- * @param sqlStatementContext SQL statement context
* @return is need refresh meta data or not
*/
- public boolean isNeedRefresh(final SQLStatementContext
sqlStatementContext) {
- return
findFederationMetaDataRefresher(sqlStatementContext).isPresent();
+ public boolean isNeedRefresh() {
+ return null != refresher;
}
/**
* Refresh federation meta data.
*
- * @param sqlStatementContext SQL statement context
+ * @param metaDataManagerPersistService meta data manager persist service
+ * @param database database
*/
@SuppressWarnings("unchecked")
- public void refresh(final SQLStatementContext sqlStatementContext) {
-
findFederationMetaDataRefresher(sqlStatementContext).ifPresent(optional ->
optional.refresh(metaDataManagerPersistService,
- sqlStatementContext.getSqlStatement().getDatabaseType(),
database, SchemaRefreshUtils.getSchemaName(database, sqlStatementContext),
sqlStatementContext.getSqlStatement()));
- }
-
- @SuppressWarnings("rawtypes")
- private Optional<FederationMetaDataRefresher>
findFederationMetaDataRefresher(final SQLStatementContext sqlStatementContext) {
- Optional<FederationMetaDataRefresher> refresher =
TypedSPILoader.findService(FederationMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass());
- if (!refresher.isPresent()) {
- refresher =
TypedSPILoader.findService(FederationMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass().getSuperclass());
- }
- return refresher;
+ public void refresh(final MetaDataManagerPersistService
metaDataManagerPersistService, final ShardingSphereDatabase database) {
+ refresher.refresh(metaDataManagerPersistService,
+ sqlStatementContext.getSqlStatement().getDatabaseType(),
database, SchemaRefreshUtils.getSchemaName(database, sqlStatementContext),
sqlStatementContext.getSqlStatement());
}
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/StandardDatabaseProxyConnector.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/StandardDatabaseProxyConnector.java
index 1bbef2b7bf2..073ad3ff3ca 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/StandardDatabaseProxyConnector.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/StandardDatabaseProxyConnector.java
@@ -118,8 +118,6 @@ public final class StandardDatabaseProxyConnector
implements DatabaseProxyConnec
private final PushDownMetaDataRefreshEngine pushDownMetaDataRefreshEngine;
- private final FederationMetaDataRefreshEngine
federationMetaDataRefreshEngine;
-
private final Collection<Statement> cachedStatements =
Collections.newSetFromMap(new ConcurrentHashMap<>());
private final Collection<ResultSet> cachedResultSets =
Collections.newSetFromMap(new ConcurrentHashMap<>());
@@ -143,7 +141,6 @@ public final class StandardDatabaseProxyConnector
implements DatabaseProxyConnec
proxySQLExecutor = new ProxySQLExecutor(driverType,
databaseConnectionManager, this, sqlStatementContext);
pushDownMetaDataRefreshEngine = new PushDownMetaDataRefreshEngine(
contextManager.getPersistServiceFacade().getModeFacade().getMetaDataManagerService(),
database, contextManager.getMetaDataContexts().getMetaData().getProps());
- federationMetaDataRefreshEngine = new
FederationMetaDataRefreshEngine(contextManager.getPersistServiceFacade().getModeFacade().getMetaDataManagerService(),
database);
}
private void checkBackendReady(final SQLStatementContext
sqlStatementContext) {
@@ -190,8 +187,9 @@ public final class StandardDatabaseProxyConnector
implements DatabaseProxyConnec
if (proxySQLExecutor.getSqlFederationEngine().decide(queryContext,
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData())) {
return doExecuteFederation();
}
- if (proxySQLExecutor.getSqlFederationEngine().isSqlFederationEnabled()
&&
federationMetaDataRefreshEngine.isNeedRefresh(queryContext.getSqlStatementContext()))
{
-
federationMetaDataRefreshEngine.refresh(queryContext.getSqlStatementContext());
+ FederationMetaDataRefreshEngine federationMetaDataRefreshEngine = new
FederationMetaDataRefreshEngine(queryContext.getSqlStatementContext());
+ if (proxySQLExecutor.getSqlFederationEngine().isSqlFederationEnabled()
&& federationMetaDataRefreshEngine.isNeedRefresh()) {
+
federationMetaDataRefreshEngine.refresh(contextManager.getPersistServiceFacade().getModeFacade().getMetaDataManagerService(),
database);
return new
UpdateResponseHeader(queryContext.getSqlStatementContext().getSqlStatement());
}
ExecutionContext executionContext = generateExecutionContext();