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 f37370a11b7 Use SPI to handle DataSourceEnvironment (#36599)
f37370a11b7 is described below

commit f37370a11b7a42518157f014946acd254cb9783d
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Wed Sep 17 14:31:00 2025 +0800

    Use SPI to handle DataSourceEnvironment (#36599)
    
    * Remove useless ProxyContainerConstants.AGENT_HOME_IN_CONTAINER
    
    * Use SPI to handle DataSourceEnvironment
---
 .../impl/ShardingSphereProxyClusterContainer.java  |  13 ++-
 .../impl/ShardingSphereProxyEmbeddedContainer.java |   8 +-
 .../ShardingSphereProxyStandaloneContainer.java    |  10 +-
 .../StorageContainerConfigurationOption.java       |   2 +
 .../type/docker/DockerStorageContainer.java        |  12 ++-
 .../type/natived/NativeStorageContainer.java       |  10 +-
 .../atomic/util/StorageContainerUtils.java         |   5 +-
 .../e2e/env/runtime/DataSourceEnvironment.java     | 109 ---------------------
 .../runtime/datasource/DataSourceEnvironment.java  |  55 +++++++++++
 .../dialect/HiveDataSourceEnvironment.java         |  46 +++++++++
 .../dialect/MariaDBDataSourceEnvironment.java      |  50 ++++++++++
 .../dialect/MySQLDataSourceEnvironment.java        |  51 ++++++++++
 .../dialect/OpenGaussDataSourceEnvironment.java    |  46 +++++++++
 .../dialect/PostgreSQLDataSourceEnvironment.java   |  46 +++++++++
 ...2e.env.runtime.datasource.DataSourceEnvironment |  22 +++++
 .../pipeline/cases/PipelineContainerComposer.java  |   8 +-
 .../compose/PipelineDockerContainerComposer.java   |   4 +-
 .../compose/PipelineNativeContainerComposer.java   |  12 ++-
 .../engine/base/TransactionBaseE2EIT.java          |  21 ++--
 19 files changed, 379 insertions(+), 151 deletions(-)

diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyClusterContainer.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyClusterContainer.java
index 9c6e7b610e7..ff82a568be1 100644
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyClusterContainer.java
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyClusterContainer.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.impl;
 
 import com.google.common.base.Strings;
 import lombok.Setter;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.DockerITContainer;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.AdapterContainer;
@@ -26,7 +27,7 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.config.Ad
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.constants.ProxyContainerConstants;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtils;
 import 
org.apache.shardingsphere.test.e2e.env.container.wait.JdbcConnectionWaitStrategy;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 
 import javax.sql.DataSource;
 import java.sql.DriverManager;
@@ -65,8 +66,9 @@ public final class ShardingSphereProxyClusterContainer 
extends DockerITContainer
         }
         addEnv("TZ", "UTC");
         mapResources(config.getMountedResources());
-        setWaitStrategy(new JdbcConnectionWaitStrategy(() -> 
DriverManager.getConnection(DataSourceEnvironment.getURL(databaseType,
-                getHost(), getMappedPort(3307), 
config.getProxyDataSourceName()), ProxyContainerConstants.USERNAME, 
ProxyContainerConstants.PASSWORD)));
+        DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
+        setWaitStrategy(new JdbcConnectionWaitStrategy(() -> 
DriverManager.getConnection(
+                dataSourceEnvironment.getURL(getHost(), getMappedPort(3307), 
config.getProxyDataSourceName()), ProxyContainerConstants.USERNAME, 
ProxyContainerConstants.PASSWORD)));
         withStartupTimeout(Duration.of(120L, ChronoUnit.SECONDS));
     }
     
@@ -74,8 +76,9 @@ public final class ShardingSphereProxyClusterContainer 
extends DockerITContainer
     public DataSource getTargetDataSource(final String serverLists) {
         DataSource dataSource = targetDataSourceProvider.get();
         if (null == dataSource) {
-            
targetDataSourceProvider.set(StorageContainerUtils.generateDataSource(DataSourceEnvironment.getURL(databaseType,
 getHost(), getMappedPort(3307), config.getProxyDataSourceName()),
-                    ProxyContainerConstants.USERNAME, 
ProxyContainerConstants.PASSWORD));
+            DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
+            
targetDataSourceProvider.set(StorageContainerUtils.generateDataSource(
+                    dataSourceEnvironment.getURL(getHost(), 
getMappedPort(3307), config.getProxyDataSourceName()), 
ProxyContainerConstants.USERNAME, ProxyContainerConstants.PASSWORD));
         }
         return targetDataSourceProvider.get();
     }
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyEmbeddedContainer.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyEmbeddedContainer.java
index e4ee32ca605..98bf3099245 100644
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyEmbeddedContainer.java
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyEmbeddedContainer.java
@@ -22,6 +22,7 @@ import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.SystemUtils;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.proxy.backend.config.ProxyConfigurationLoader;
@@ -38,8 +39,8 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.constants.Storage
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.type.natived.NativeStorageContainer;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtils;
 import 
org.apache.shardingsphere.test.e2e.env.container.wait.JdbcConnectionWaitStrategy;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
 import org.apache.shardingsphere.test.e2e.env.runtime.E2ETestEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.lifecycle.Startable;
 import org.testcontainers.utility.Base58;
@@ -93,8 +94,9 @@ public final class ShardingSphereProxyEmbeddedContainer 
implements AdapterContai
     public DataSource getTargetDataSource(final String serverLists) {
         DataSource dataSource = targetDataSourceProvider.get();
         if (null == dataSource) {
-            
targetDataSourceProvider.set(StorageContainerUtils.generateDataSource(DataSourceEnvironment.getURL(databaseType,
 "127.0.0.1", 3307, config.getProxyDataSourceName()),
-                    ProxyContainerConstants.USERNAME, 
ProxyContainerConstants.PASSWORD));
+            DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
+            
targetDataSourceProvider.set(StorageContainerUtils.generateDataSource(dataSourceEnvironment.getURL(
+                    "127.0.0.1", 3307, config.getProxyDataSourceName()), 
ProxyContainerConstants.USERNAME, ProxyContainerConstants.PASSWORD));
         }
         return targetDataSourceProvider.get();
     }
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyStandaloneContainer.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyStandaloneContainer.java
index 08e72f8d5dd..51effec997e 100644
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyStandaloneContainer.java
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/adapter/impl/ShardingSphereProxyStandaloneContainer.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.impl;
 
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.DockerITContainer;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.AdapterContainer;
@@ -24,7 +25,7 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.adapter.config.Ad
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.constants.ProxyContainerConstants;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtils;
 import 
org.apache.shardingsphere.test.e2e.env.container.wait.JdbcConnectionWaitStrategy;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 
 import javax.sql.DataSource;
 import java.sql.DriverManager;
@@ -52,15 +53,16 @@ public final class ShardingSphereProxyStandaloneContainer 
extends DockerITContai
         withExposedPorts(3307, 3308);
         mapResources(config.getMountedResources());
         setWaitStrategy(new JdbcConnectionWaitStrategy(() -> 
DriverManager.getConnection(
-                DataSourceEnvironment.getURL(databaseType, getHost(), 
getMappedPort(3307), config.getProxyDataSourceName()), "proxy", "Proxy@123")));
+                DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, 
databaseType).getURL(getHost(), getMappedPort(3307), 
config.getProxyDataSourceName()), "proxy", "Proxy@123")));
     }
     
     @Override
     public DataSource getTargetDataSource(final String serverLists) {
         DataSource dataSource = targetDataSourceProvider.get();
         if (null == dataSource) {
-            
targetDataSourceProvider.set(StorageContainerUtils.generateDataSource(DataSourceEnvironment.getURL(databaseType,
 getHost(), getMappedPort(3307), config.getProxyDataSourceName()),
-                    ProxyContainerConstants.USERNAME, 
ProxyContainerConstants.PASSWORD));
+            DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
+            
targetDataSourceProvider.set(StorageContainerUtils.generateDataSource(
+                    dataSourceEnvironment.getURL(getHost(), 
getMappedPort(3307), config.getProxyDataSourceName()), 
ProxyContainerConstants.USERNAME, ProxyContainerConstants.PASSWORD));
         }
         return targetDataSourceProvider.get();
     }
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/option/StorageContainerConfigurationOption.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/option/StorageContainerConfigurationOption.java
index be248ea6ea3..cfdc238b278 100644
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/option/StorageContainerConfigurationOption.java
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/option/StorageContainerConfigurationOption.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.test.e2e.env.container.atomic.storage.option;
 
 import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPI;
+import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
 
 import java.util.Collection;
 import java.util.List;
@@ -27,6 +28,7 @@ import java.util.Optional;
 /**
  * Storage container configuration option.
  */
+@SingletonSPI
 public interface StorageContainerConfigurationOption extends DatabaseTypedSPI {
     
     /**
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/docker/DockerStorageContainer.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/docker/DockerStorageContainer.java
index 9293c5b4134..8c063230f75 100644
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/docker/DockerStorageContainer.java
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/docker/DockerStorageContainer.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.type.doc
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.Getter;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.DockerITContainer;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.constants.StorageContainerConstants;
@@ -30,7 +31,7 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.option.St
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.DockerImageVersion;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtils;
 import 
org.apache.shardingsphere.test.e2e.env.container.wait.JdbcConnectionWaitStrategy;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.e2e.env.runtime.scenario.database.DatabaseEnvironmentManager;
 import 
org.apache.shardingsphere.test.e2e.env.runtime.scenario.path.ScenarioDataPath.Type;
 
@@ -106,9 +107,10 @@ public class DockerStorageContainer extends 
DockerITContainer implements Storage
     }
     
     private String getURL() {
+        DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, 
option.getType());
         return option.getDefaultDatabaseName(majorVersion)
-                .map(optional -> 
DataSourceEnvironment.getURL(option.getType(), "localhost", 
getFirstMappedPort(), optional))
-                .orElseGet(() -> 
DataSourceEnvironment.getURL(option.getType(), "localhost", 
getFirstMappedPort()));
+                .map(optional -> dataSourceEnvironment.getURL("localhost", 
getFirstMappedPort(), optional))
+                .orElseGet(() -> dataSourceEnvironment.getURL("localhost", 
getFirstMappedPort()));
     }
     
     @Override
@@ -146,8 +148,8 @@ public class DockerStorageContainer extends 
DockerITContainer implements Storage
      * @return JDBC URL
      */
     public final String getJdbcUrl(final String dataSourceName) {
-        return DataSourceEnvironment.getURL(
-                option.getType(), getHost(), getMappedPort(), 
Strings.isNullOrEmpty(dataSourceName) ? 
option.getDefaultDatabaseName(majorVersion).orElse("") : dataSourceName);
+        DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, 
option.getType());
+        return dataSourceEnvironment.getURL(getHost(), getMappedPort(), 
Strings.isNullOrEmpty(dataSourceName) ? 
option.getDefaultDatabaseName(majorVersion).orElse("") : dataSourceName);
     }
     
     /**
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/natived/NativeStorageContainer.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/natived/NativeStorageContainer.java
index 0a1b46e6cb2..ac86b7570d3 100644
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/natived/NativeStorageContainer.java
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/storage/type/natived/NativeStorageContainer.java
@@ -27,8 +27,8 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.mount.Mou
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.option.StorageContainerConfigurationOption;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.SQLScriptUtils;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtils;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
 import org.apache.shardingsphere.test.e2e.env.runtime.E2ETestEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.e2e.env.runtime.scenario.database.DatabaseEnvironmentManager;
 import 
org.apache.shardingsphere.test.e2e.env.runtime.scenario.path.ScenarioDataPath.Type;
 
@@ -75,9 +75,10 @@ public final class NativeStorageContainer implements 
StorageContainer {
     }
     
     private void initDatabase() {
-        DataSource dataSource = StorageContainerUtils.generateDataSource(
-                DataSourceEnvironment.getURL(databaseType, 
env.getNativeStorageHost(), env.getNativeStoragePort()), 
env.getNativeStorageUsername(), env.getNativeStoragePassword());
         if (null != option) {
+            DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
+            DataSource dataSource = StorageContainerUtils.generateDataSource(
+                    dataSourceEnvironment.getURL(env.getNativeStorageHost(), 
env.getNativeStoragePort()), env.getNativeStorageUsername(), 
env.getNativeStoragePassword());
             new MountSQLResourceGenerator(option).generate(0, 
scenario).keySet().forEach(each -> SQLScriptUtils.execute(dataSource, each));
         }
     }
@@ -91,9 +92,10 @@ public final class NativeStorageContainer implements 
StorageContainer {
     
     private Map<String, DataSource> getDataSourceMap(final Collection<String> 
databaseNames) {
         Map<String, DataSource> result = new HashMap<>(databaseNames.size(), 
1F);
+        DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
         for (String each : databaseNames) {
             DataSource dataSource = StorageContainerUtils.generateDataSource(
-                    DataSourceEnvironment.getURL(databaseType, 
env.getNativeStorageHost(), env.getNativeStoragePort(), each), 
env.getNativeStorageUsername(), env.getNativeStoragePassword());
+                    dataSourceEnvironment.getURL(env.getNativeStorageHost(), 
env.getNativeStoragePort(), each), env.getNativeStorageUsername(), 
env.getNativeStoragePassword());
             result.put(each, dataSource);
         }
         return result;
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/util/StorageContainerUtils.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/util/StorageContainerUtils.java
index 550a438bb86..6b1bbbeb8e9 100644
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/util/StorageContainerUtils.java
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/container/atomic/util/StorageContainerUtils.java
@@ -20,8 +20,9 @@ package 
org.apache.shardingsphere.test.e2e.env.container.atomic.util;
 import com.zaxxer.hikari.HikariDataSource;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeFactory;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 
 import javax.sql.DataSource;
 
@@ -53,7 +54,7 @@ public final class StorageContainerUtils {
      * @return data source
      */
     public static DataSource generateDataSource(final String jdbcUrl, final 
String username, final String password, final int maximumPoolSize) {
-        String driverClassName = 
DataSourceEnvironment.getDriverClassName(DatabaseTypeFactory.get(jdbcUrl));
+        String driverClassName = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, 
DatabaseTypeFactory.get(jdbcUrl)).getDriverClassName();
         return generateDataSource(jdbcUrl, username, password, 
maximumPoolSize, driverClassName);
     }
     
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/DataSourceEnvironment.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/DataSourceEnvironment.java
deleted file mode 100644
index d2117320247..00000000000
--- 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/DataSourceEnvironment.java
+++ /dev/null
@@ -1,109 +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.test.e2e.env.runtime;
-
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-
-/**
- * Data source environment.
- */
-public final class DataSourceEnvironment {
-    
-    /**
-     * Get driver class name.
-     *
-     * @param databaseType database type
-     * @return driver class name
-     * @throws UnsupportedOperationException unsupported operation exception
-     */
-    public static String getDriverClassName(final DatabaseType databaseType) {
-        switch (databaseType.getType()) {
-            case "MySQL":
-                return "com.mysql.cj.jdbc.Driver";
-            case "MariaDB":
-                return "org.mariadb.jdbc.Driver";
-            case "PostgreSQL":
-                return "org.postgresql.Driver";
-            case "openGauss":
-                return "org.opengauss.Driver";
-            case "Hive":
-                return "org.apache.hive.jdbc.HiveDriver";
-            default:
-                throw new 
UnsupportedOperationException(databaseType.getType());
-        }
-    }
-    
-    /**
-     * Get URL.
-     *
-     * @param databaseType database type
-     * @param host database host
-     * @param port database port
-     * @return URL
-     * @throws UnsupportedOperationException unsupported operation exception
-     */
-    public static String getURL(final DatabaseType databaseType, final String 
host, final int port) {
-        switch (databaseType.getType()) {
-            case "MySQL":
-                return 
String.format("jdbc:mysql://%s:%s?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false"
-                        + 
"&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowMultiQueries=true&rewriteBatchedStatements=true",
 host, port);
-            case "MariaDB":
-                return 
String.format("jdbc:mysql://%s:%s?useSSL=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowMultiQueries=true&rewriteBatchedStatements=true",
-                        host, port);
-            case "PostgreSQL":
-                return 
String.format("jdbc:postgresql://%s:%s/?ssl=on&sslmode=prefer", host, port);
-            case "openGauss":
-                return String.format("jdbc:opengauss://%s:%s/", host, port);
-            case "Hive":
-                return String.format("jdbc:hive2://%s:%s/", host, port);
-            default:
-                throw new 
UnsupportedOperationException(databaseType.getType());
-        }
-    }
-    
-    /**
-     * Get URL.
-     *
-     * @param databaseType database type
-     * @param host database host
-     * @param port database port
-     * @param dataSourceName data source name
-     * @return URL
-     * @throws UnsupportedOperationException unsupported operation exception
-     */
-    public static String getURL(final DatabaseType databaseType, final String 
host, final int port, final String dataSourceName) {
-        switch (databaseType.getType()) {
-            case "MySQL":
-                return String.format(
-                        
"jdbc:mysql://%s:%s/%s?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false"
-                                + 
"&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true",
-                        host, port, dataSourceName);
-            case "MariaDB":
-                return 
String.format("jdbc:mysql://%s:%s/%s?useSSL=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowMultiQueries=true"
-                        + "&rewriteBatchedStatements=true", host, port, 
dataSourceName);
-            case "PostgreSQL":
-                return 
String.format("jdbc:postgresql://%s:%s/%s?ssl=on&sslmode=prefer", host, port, 
dataSourceName);
-            case "openGauss":
-                return 
String.format("jdbc:opengauss://%s:%s/%s?batchMode=OFF", host, port, 
dataSourceName);
-            case "Hive":
-                return 
String.format("jdbc:hive2://%s:%s/%s?ssl=false&useUnicode=true&characterEncoding=utf-8",
 host, port, dataSourceName);
-            default:
-                throw new 
UnsupportedOperationException(databaseType.getType());
-        }
-    }
-}
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/DataSourceEnvironment.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/DataSourceEnvironment.java
new file mode 100644
index 00000000000..61f8d37d6c6
--- /dev/null
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/DataSourceEnvironment.java
@@ -0,0 +1,55 @@
+/*
+ * 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.test.e2e.env.runtime.datasource;
+
+import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPI;
+import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
+
+/**
+ * Data source environment.
+ */
+@SingletonSPI
+public interface DataSourceEnvironment extends DatabaseTypedSPI {
+    
+    /**
+     * Get driver class name.
+     *
+     * @return driver class name
+     * @throws UnsupportedOperationException unsupported operation exception
+     */
+    String getDriverClassName();
+    
+    /**
+     * Get URL.
+     *
+     * @param host database host
+     * @param port database port
+     * @return URL
+     */
+    String getURL(String host, int port);
+    
+    /**
+     * Get URL.
+     *
+     * @param host database host
+     * @param port database port
+     * @param dataSourceName data source name
+     * @return URL
+     */
+    String getURL(String host, int port, String dataSourceName);
+}
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/HiveDataSourceEnvironment.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/HiveDataSourceEnvironment.java
new file mode 100644
index 00000000000..f9dfb02a5c7
--- /dev/null
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/HiveDataSourceEnvironment.java
@@ -0,0 +1,46 @@
+/*
+ * 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.test.e2e.env.runtime.datasource.dialect;
+
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
+
+/**
+ * Data source environment for Hive.
+ */
+public final class HiveDataSourceEnvironment implements DataSourceEnvironment {
+    
+    @Override
+    public String getDriverClassName() {
+        return "org.apache.hive.jdbc.HiveDriver";
+    }
+    
+    @Override
+    public String getURL(final String host, final int port) {
+        return String.format("jdbc:hive2://%s:%s/", host, port);
+    }
+    
+    @Override
+    public String getURL(final String host, final int port, final String 
dataSourceName) {
+        return 
String.format("jdbc:hive2://%s:%s/%s?ssl=false&useUnicode=true&characterEncoding=utf-8",
 host, port, dataSourceName);
+    }
+    
+    @Override
+    public String getDatabaseType() {
+        return "Hive";
+    }
+}
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/MariaDBDataSourceEnvironment.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/MariaDBDataSourceEnvironment.java
new file mode 100644
index 00000000000..b2aca9d8751
--- /dev/null
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/MariaDBDataSourceEnvironment.java
@@ -0,0 +1,50 @@
+/*
+ * 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.test.e2e.env.runtime.datasource.dialect;
+
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
+
+/**
+ * Data source environment for MariaDB.
+ */
+public final class MariaDBDataSourceEnvironment implements 
DataSourceEnvironment {
+    
+    @Override
+    public String getDriverClassName() {
+        return "org.mariadb.jdbc.Driver";
+    }
+    
+    @Override
+    public String getURL(final String host, final int port) {
+        return String.format("jdbc:mysql://%s:%s?%s", host, port, 
getQueryProperties());
+    }
+    
+    @Override
+    public String getURL(final String host, final int port, final String 
dataSourceName) {
+        return String.format("jdbc:mysql://%s:%s/%s?%s", host, port, 
dataSourceName, getQueryProperties());
+    }
+    
+    private String getQueryProperties() {
+        return 
"useSSL=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowMultiQueries=true&rewriteBatchedStatements=true";
+    }
+    
+    @Override
+    public String getDatabaseType() {
+        return "MariaDB";
+    }
+}
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/MySQLDataSourceEnvironment.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/MySQLDataSourceEnvironment.java
new file mode 100644
index 00000000000..e4a4c00fd3d
--- /dev/null
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/MySQLDataSourceEnvironment.java
@@ -0,0 +1,51 @@
+/*
+ * 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.test.e2e.env.runtime.datasource.dialect;
+
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
+
+/**
+ * Data source environment for MySQL.
+ */
+public final class MySQLDataSourceEnvironment implements DataSourceEnvironment 
{
+    
+    @Override
+    public String getDriverClassName() {
+        return "com.mysql.cj.jdbc.Driver";
+    }
+    
+    @Override
+    public String getURL(final String host, final int port) {
+        return String.format("jdbc:mysql://%s:%s?%s", host, port, 
getQueryProperties());
+    }
+    
+    @Override
+    public String getURL(final String host, final int port, final String 
dataSourceName) {
+        return String.format("jdbc:mysql://%s:%s/%s?%s", host, port, 
dataSourceName, getQueryProperties());
+    }
+    
+    private String getQueryProperties() {
+        return 
"useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false"
+                + 
"&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true";
+    }
+    
+    @Override
+    public String getDatabaseType() {
+        return "MySQL";
+    }
+}
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/OpenGaussDataSourceEnvironment.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/OpenGaussDataSourceEnvironment.java
new file mode 100644
index 00000000000..ccada15dc66
--- /dev/null
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/OpenGaussDataSourceEnvironment.java
@@ -0,0 +1,46 @@
+/*
+ * 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.test.e2e.env.runtime.datasource.dialect;
+
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
+
+/**
+ * Data source environment for openGauss.
+ */
+public final class OpenGaussDataSourceEnvironment implements 
DataSourceEnvironment {
+    
+    @Override
+    public String getDriverClassName() {
+        return "org.opengauss.Driver";
+    }
+    
+    @Override
+    public String getURL(final String host, final int port) {
+        return String.format("jdbc:opengauss://%s:%s/", host, port);
+    }
+    
+    @Override
+    public String getURL(final String host, final int port, final String 
dataSourceName) {
+        return String.format("jdbc:opengauss://%s:%s/%s?batchMode=OFF", host, 
port, dataSourceName);
+    }
+    
+    @Override
+    public String getDatabaseType() {
+        return "openGauss";
+    }
+}
diff --git 
a/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/PostgreSQLDataSourceEnvironment.java
 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/PostgreSQLDataSourceEnvironment.java
new file mode 100644
index 00000000000..6b5ecf76150
--- /dev/null
+++ 
b/test/e2e/env/src/test/java/org/apache/shardingsphere/test/e2e/env/runtime/datasource/dialect/PostgreSQLDataSourceEnvironment.java
@@ -0,0 +1,46 @@
+/*
+ * 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.test.e2e.env.runtime.datasource.dialect;
+
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
+
+/**
+ * Data source environment for PostgreSQL.
+ */
+public final class PostgreSQLDataSourceEnvironment implements 
DataSourceEnvironment {
+    
+    @Override
+    public String getDriverClassName() {
+        return "org.postgresql.Driver";
+    }
+    
+    @Override
+    public String getURL(final String host, final int port) {
+        return String.format("jdbc:postgresql://%s:%s/?ssl=on&sslmode=prefer", 
host, port);
+    }
+    
+    @Override
+    public String getURL(final String host, final int port, final String 
dataSourceName) {
+        return 
String.format("jdbc:postgresql://%s:%s/%s?ssl=on&sslmode=prefer", host, port, 
dataSourceName);
+    }
+    
+    @Override
+    public String getDatabaseType() {
+        return "PostgreSQL";
+    }
+}
diff --git 
a/test/e2e/env/src/test/resources/META-INF/services/org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment
 
b/test/e2e/env/src/test/resources/META-INF/services/org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment
new file mode 100644
index 00000000000..5b253bc8d61
--- /dev/null
+++ 
b/test/e2e/env/src/test/resources/META-INF/services/org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.test.e2e.env.runtime.datasource.dialect.MySQLDataSourceEnvironment
+org.apache.shardingsphere.test.e2e.env.runtime.datasource.dialect.PostgreSQLDataSourceEnvironment
+org.apache.shardingsphere.test.e2e.env.runtime.datasource.dialect.MariaDBDataSourceEnvironment
+org.apache.shardingsphere.test.e2e.env.runtime.datasource.dialect.OpenGaussDataSourceEnvironment
+org.apache.shardingsphere.test.e2e.env.runtime.datasource.dialect.HiveDataSourceEnvironment
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/cases/PipelineContainerComposer.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/cases/PipelineContainerComposer.java
index ddaa7b69bd4..627e681f133 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/cases/PipelineContainerComposer.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/cases/PipelineContainerComposer.java
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourc
 import org.apache.shardingsphere.data.pipeline.core.job.JobStatus;
 import org.apache.shardingsphere.data.pipeline.core.job.type.PipelineJobType;
 import 
org.apache.shardingsphere.database.connector.core.jdbcurl.appender.JdbcUrlAppender;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.database.connector.mysql.type.MySQLDatabaseType;
@@ -44,7 +45,7 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.constants.ProxyCo
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.constants.StorageContainerConstants;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.type.docker.DockerStorageContainer;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.StorageContainerUtils;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.e2e.operation.pipeline.command.ExtraSQLCommand;
 import 
org.apache.shardingsphere.test.e2e.operation.pipeline.env.PipelineE2EEnvironment;
 import 
org.apache.shardingsphere.test.e2e.operation.pipeline.env.enums.PipelineEnvTypeEnum;
@@ -278,13 +279,14 @@ public final class PipelineContainerComposer implements 
AutoCloseable {
      * @return actual JDBC URL template
      */
     public String getActualJdbcUrlTemplate(final String databaseName, final 
boolean isInContainer, final int storageContainerIndex) {
+        DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
         if (PipelineEnvTypeEnum.DOCKER == 
PipelineE2EEnvironment.getInstance().getItEnvType()) {
             DockerStorageContainer storageContainer = 
((PipelineDockerContainerComposer) 
containerComposer).getStorageContainers().get(storageContainerIndex);
             return isInContainer
-                    ? DataSourceEnvironment.getURL(databaseType, 
storageContainer.getNetworkAliases().get(0), storageContainer.getExposedPort(), 
databaseName)
+                    ? 
dataSourceEnvironment.getURL(storageContainer.getNetworkAliases().get(0), 
storageContainer.getExposedPort(), databaseName)
                     : storageContainer.getJdbcUrl(databaseName);
         }
-        return DataSourceEnvironment.getURL(databaseType, "127.0.0.1", 
PipelineE2EEnvironment.getInstance().getActualDatabasePort(databaseType), 
databaseName);
+        return dataSourceEnvironment.getURL("127.0.0.1", 
PipelineE2EEnvironment.getInstance().getActualDatabasePort(databaseType), 
databaseName);
     }
     
     /**
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineDockerContainerComposer.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineDockerContainerComposer.java
index 44f5cf71806..9c441b9c89b 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineDockerContainerComposer.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineDockerContainerComposer.java
@@ -30,7 +30,7 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.governance.impl.Z
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.StorageContainerFactory;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.option.StorageContainerConfigurationOption;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.type.docker.DockerStorageContainer;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.e2e.operation.pipeline.env.PipelineE2EEnvironment;
 import 
org.apache.shardingsphere.test.e2e.operation.pipeline.env.enums.PipelineProxyTypeEnum;
 import 
org.apache.shardingsphere.test.e2e.operation.pipeline.framework.container.config.proxy.PipelineProxyContainerConfigurationFactory;
@@ -91,7 +91,7 @@ public final class PipelineDockerContainerComposer extends 
PipelineBaseContainer
             port = proxyContainer.getFirstMappedPort();
         }
         DatabaseType databaseType = 
"Oracle".equals(this.databaseType.getType()) ? 
TypedSPILoader.getService(DatabaseType.class, "MySQL") : this.databaseType;
-        return DataSourceEnvironment.getURL(databaseType, host, port, 
databaseName);
+        return DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, 
databaseType).getURL(host, port, databaseName);
     }
     
     @Override
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineNativeContainerComposer.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineNativeContainerComposer.java
index 0cbc07c637b..dd6d24c4b30 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineNativeContainerComposer.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/operation/pipeline/framework/container/compose/PipelineNativeContainerComposer.java
@@ -19,11 +19,12 @@ package 
org.apache.shardingsphere.test.e2e.operation.pipeline.framework.containe
 
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.database.connector.core.jdbcurl.appender.JdbcUrlAppender;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.infra.util.props.PropertiesBuilder;
 import org.apache.shardingsphere.infra.util.props.PropertiesBuilder.Property;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.e2e.operation.pipeline.env.PipelineE2EEnvironment;
 
 import java.sql.Connection;
@@ -54,12 +55,13 @@ public final class PipelineNativeContainerComposer extends 
PipelineBaseContainer
         int actualDatabasePort = ENV.getActualDatabasePort(databaseType);
         String username = ENV.getActualDataSourceUsername(databaseType);
         String password = ENV.getActualDataSourcePassword(databaseType);
+        DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, databaseType);
         String jdbcUrl;
         switch (databaseType.getType()) {
             case "MySQL":
             case "MariaDB":
                 String queryAllTables = String.format("select table_name from 
information_schema.tables where table_schema='%s' and table_type='BASE TABLE'", 
databaseName);
-                jdbcUrl = DataSourceEnvironment.getURL(databaseType, 
"localhost", actualDatabasePort, databaseName);
+                jdbcUrl = dataSourceEnvironment.getURL("localhost", 
actualDatabasePort, databaseName);
                 try (
                         Connection connection = DriverManager.getConnection(
                                 jdbcUrlAppender.appendQueryProperties(jdbcUrl, 
PropertiesBuilder.build(new Property("allowPublicKeyRetrieval", 
Boolean.TRUE.toString()))), username, password)) {
@@ -73,7 +75,7 @@ public final class PipelineNativeContainerComposer extends 
PipelineBaseContainer
                 break;
             case "openGauss":
             case "PostgreSQL":
-                jdbcUrl = DataSourceEnvironment.getURL(databaseType, 
"localhost", actualDatabasePort, databaseName);
+                jdbcUrl = dataSourceEnvironment.getURL("localhost", 
actualDatabasePort, databaseName);
                 try (Connection connection = 
DriverManager.getConnection(jdbcUrl, username, password)) {
                     dropTableWithSchema(connection, "public");
                     dropTableWithSchema(connection, "test");
@@ -81,7 +83,7 @@ public final class PipelineNativeContainerComposer extends 
PipelineBaseContainer
                 }
                 break;
             case "Oracle":
-                jdbcUrl = DataSourceEnvironment.getURL(databaseType, 
"localhost", actualDatabasePort, "");
+                jdbcUrl = dataSourceEnvironment.getURL("localhost", 
actualDatabasePort, "");
                 try (Connection connection = 
DriverManager.getConnection(jdbcUrl, username, password)) {
                     dropTableWithOracle(connection, databaseName);
                 }
@@ -121,7 +123,7 @@ public final class PipelineNativeContainerComposer extends 
PipelineBaseContainer
     @Override
     public String getProxyJdbcUrl(final String databaseName) {
         DatabaseType databaseType = 
"Oracle".equals(this.databaseType.getType()) ? 
TypedSPILoader.getService(DatabaseType.class, "MySQL") : this.databaseType;
-        return DataSourceEnvironment.getURL(databaseType, "localhost", 3307, 
databaseName);
+        return DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, 
databaseType).getURL("localhost", 3307, databaseName);
     }
     
     @Override
diff --git 
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/operation/transaction/engine/base/TransactionBaseE2EIT.java
 
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/operation/transaction/engine/base/TransactionBaseE2EIT.java
index c24fb62f7b1..665dad833ff 100644
--- 
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/operation/transaction/engine/base/TransactionBaseE2EIT.java
+++ 
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/operation/transaction/engine/base/TransactionBaseE2EIT.java
@@ -21,11 +21,12 @@ import com.google.common.base.Preconditions;
 import lombok.Getter;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.enums.AdapterType;
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.type.docker.DockerStorageContainer;
-import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
+import 
org.apache.shardingsphere.test.e2e.env.runtime.datasource.DataSourceEnvironment;
 import 
org.apache.shardingsphere.test.e2e.operation.transaction.cases.base.BaseTransactionTestCase;
 import 
org.apache.shardingsphere.test.e2e.operation.transaction.cases.base.BaseTransactionTestCase.TransactionTestCaseParameter;
 import 
org.apache.shardingsphere.test.e2e.operation.transaction.engine.command.CommonSQLCommand;
@@ -275,12 +276,12 @@ public abstract class TransactionBaseE2EIT {
     }
     
     private String getActualJdbcUrlTemplate(final String databaseName, final 
TransactionContainerComposer containerComposer) {
+        DataSourceEnvironment dataSourceEnvironment = 
DatabaseTypedSPILoader.getService(DataSourceEnvironment.class, 
containerComposer.getDatabaseType());
         if (ENV.getItEnvType() == TransactionE2EEnvTypeEnum.DOCKER) {
             DockerStorageContainer storageContainer = (DockerStorageContainer) 
((TransactionDockerContainerComposer) 
containerComposer.getContainerComposer()).getStorageContainer();
-            return 
DataSourceEnvironment.getURL(containerComposer.getDatabaseType(),
-                    
containerComposer.getDatabaseType().getType().toLowerCase() + ".host", 
storageContainer.getExposedPort(), databaseName);
+            return 
dataSourceEnvironment.getURL(containerComposer.getDatabaseType().getType().toLowerCase()
 + ".host", storageContainer.getExposedPort(), databaseName);
         }
-        return 
DataSourceEnvironment.getURL(containerComposer.getDatabaseType(), "127.0.0.1", 
ENV.getActualDataSourceDefaultPort(containerComposer.getDatabaseType()), 
databaseName);
+        return dataSourceEnvironment.getURL("127.0.0.1", 
ENV.getActualDataSourceDefaultPort(containerComposer.getDatabaseType()), 
databaseName);
     }
     
     /**
@@ -297,8 +298,10 @@ public abstract class TransactionBaseE2EIT {
     }
     
     private void executeWithLog(final Connection connection, final String sql) 
throws SQLException {
-        log.info("Connection execute:{}.", sql);
-        connection.createStatement().execute(sql);
+        log.info("Connection execute: {}.", sql);
+        try (Statement statement = connection.createStatement()) {
+            statement.execute(sql);
+        }
         Awaitility.await().pollDelay(1L, TimeUnit.SECONDS).until(() -> true);
     }
     
@@ -306,9 +309,9 @@ public abstract class TransactionBaseE2EIT {
         try (Connection connection = 
containerComposer.getDataSource().getConnection()) {
             int retryNumber = 0;
             while (retryNumber <= 3) {
-                try {
-                    Statement statement = connection.createStatement();
-                    ResultSet resultSet = statement.executeQuery(sql);
+                try (
+                        Statement statement = connection.createStatement();
+                        ResultSet resultSet = statement.executeQuery(sql)) {
                     int result = 0;
                     while (resultSet.next()) {
                         result++;

Reply via email to