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 515b905d5cd Improve default database protocol type handling (#35419) 515b905d5cd is described below commit 515b905d5cd0e0e47db5c4a75e5c210526729e82 Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Thu May 15 13:06:16 2025 +0800 Improve default database protocol type handling (#35419) - Add DEFAULT_FRONTEND_DATABASE_PROTOCOL_TYPE constant for MySQL - Refactor logic to handle multiple DatabaseProtocolFrontendEngine implementations - Use TypedSPILoader for better type safety when getting default DatabaseType --- .../protocol/FrontDatabaseProtocolTypeFactory.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactory.java b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactory.java index a294e3cc427..cdd21c5122b 100644 --- a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactory.java +++ b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactory.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; +import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine; @@ -37,6 +38,8 @@ import java.util.Optional; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class FrontDatabaseProtocolTypeFactory { + private static final String DEFAULT_FRONTEND_DATABASE_PROTOCOL_TYPE = "MySQL"; + /** * Get front database protocol type. * @@ -47,16 +50,18 @@ public final class FrontDatabaseProtocolTypeFactory { if (configuredDatabaseType.isPresent()) { return configuredDatabaseType.get(); } - Collection<DatabaseProtocolFrontendEngine> databaseProtocolFrontendEngine = ShardingSphereServiceLoader.getServiceInstances(DatabaseProtocolFrontendEngine.class); - ShardingSpherePreconditions.checkNotEmpty(databaseProtocolFrontendEngine, + Collection<DatabaseProtocolFrontendEngine> databaseProtocolFrontendEngines = ShardingSphereServiceLoader.getServiceInstances(DatabaseProtocolFrontendEngine.class); + ShardingSpherePreconditions.checkNotEmpty(databaseProtocolFrontendEngines, () -> new IllegalArgumentException(String.format("Can not find any SPI implementation of `%s`.", DatabaseProtocolFrontendEngine.class.getName()))); - DatabaseProtocolFrontendEngine defaultDatabaseProtocolFrontendEngine = databaseProtocolFrontendEngine.iterator().next(); + DatabaseType defaultDatabaseType = 1 == databaseProtocolFrontendEngines.size() + ? databaseProtocolFrontendEngines.iterator().next().getType() + : TypedSPILoader.getService(DatabaseType.class, DEFAULT_FRONTEND_DATABASE_PROTOCOL_TYPE); MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts(); if (metaDataContexts.getMetaData().getAllDatabases().isEmpty()) { - return defaultDatabaseProtocolFrontendEngine.getType(); + return defaultDatabaseType; } Optional<ShardingSphereDatabase> database = metaDataContexts.getMetaData().getAllDatabases().stream().filter(ShardingSphereDatabase::containsDataSource).findFirst(); - return database.isPresent() ? database.get().getResourceMetaData().getStorageUnits().values().iterator().next().getStorageType() : defaultDatabaseProtocolFrontendEngine.getType(); + return database.isPresent() ? database.get().getResourceMetaData().getStorageUnits().values().iterator().next().getStorageType() : defaultDatabaseType; } private static Optional<DatabaseType> findConfiguredDatabaseType() {