This is an automated email from the ASF dual-hosted git repository.
totalo 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 2cc05b5b7bc Refactor TransactionHook from TypedSPI to OrderedSPI
(#32940)
2cc05b5b7bc is described below
commit 2cc05b5b7bce3bc27b016b66cb450d03075a0334
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Sep 21 00:25:15 2024 +0800
Refactor TransactionHook from TypedSPI to OrderedSPI (#32940)
* Refactor TransactionHook from TypedSPI to OrderedSPI
* Refactor TransactionHook from TypedSPI to OrderedSPI
* Refactor TransactionHook from TypedSPI to OrderedSPI
* Refactor TransactionHook from TypedSPI to OrderedSPI
* Refactor TransactionHook from TypedSPI to OrderedSPI
---
.../executor/GlobalClockTransactionHook.java | 86 +++++++++++-----------
.../globalclock/rule/GlobalClockRule.java | 48 +++---------
.../rule/builder/GlobalClockRuleBuilder.java | 2 +-
.../transaction/spi/TransactionHook.java | 45 ++++++++---
.../connector/ProxyDatabaseConnectionManager.java | 16 +++-
.../proxy/backend/connector/ProxySQLExecutor.java | 20 +++--
.../transaction/BackendTransactionManager.java | 41 +++++++----
.../proxy/backend/context/ProxyContext.java | 14 ++++
.../ral/queryable/ExportMetaDataExecutor.java | 3 +-
.../transaction/BackendTransactionManagerTest.java | 2 +-
.../ral/queryable/ExportMetaDataExecutorTest.java | 5 +-
...DistVariableUpdatableRALBackendHandlerTest.java | 9 +++
.../TransactionIsolationValueProviderTest.java | 15 ++++
.../TransactionReadOnlyValueProviderTest.java | 15 ++++
.../sysvar/provider/VersionValueProviderTest.java | 15 ++++
15 files changed, 211 insertions(+), 125 deletions(-)
diff --git
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
index 1a9a6ca5d8e..3e195df42f1 100644
---
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
+++
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java
@@ -18,13 +18,14 @@
package org.apache.shardingsphere.globalclock.executor;
import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
+import org.apache.shardingsphere.globalclock.rule.GlobalClockRule;
+import org.apache.shardingsphere.globalclock.rule.constant.GlobalClockOrder;
import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.lock.GlobalLockNames;
import org.apache.shardingsphere.infra.lock.LockContext;
import org.apache.shardingsphere.infra.lock.LockDefinition;
import
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.lock.GlobalLockDefinition;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
import org.apache.shardingsphere.transaction.spi.TransactionHook;
@@ -33,97 +34,98 @@ import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Optional;
-import java.util.Properties;
/**
* Global clock transaction hook.
*/
-public final class GlobalClockTransactionHook implements TransactionHook {
+public final class GlobalClockTransactionHook implements
TransactionHook<GlobalClockRule> {
private final LockDefinition lockDefinition = new
GlobalLockDefinition(GlobalLockNames.GLOBAL_LOCK.getLockName());
- private boolean enabled;
-
- private GlobalClockTransactionExecutor globalClockTransactionExecutor;
-
- private GlobalClockProvider globalClockProvider;
-
@Override
- public void init(final Properties props) {
- DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, props.getProperty("trunkType"));
- Optional<GlobalClockTransactionExecutor>
globalClockTransactionExecutor =
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class,
databaseType);
- if (!globalClockTransactionExecutor.isPresent()) {
- return;
- }
- enabled = true;
- this.globalClockTransactionExecutor =
globalClockTransactionExecutor.get();
- globalClockProvider =
TypedSPILoader.getService(GlobalClockProvider.class, String.join(".",
props.getProperty("type"), props.getProperty("provider")));
+ public void beforeBegin(final GlobalClockRule rule, final DatabaseType
databaseType, final TransactionConnectionContext transactionContext) {
}
@Override
- public void beforeBegin(final TransactionConnectionContext
transactionContext) {
+ public void afterBegin(final GlobalClockRule rule, final DatabaseType
databaseType, final TransactionConnectionContext transactionContext) {
+ rule.getGlobalClockProvider().ifPresent(optional ->
transactionContext.setBeginMills(optional.getCurrentTimestamp()));
}
@Override
- public void afterBegin(final TransactionConnectionContext
transactionContext) {
- if (!enabled) {
+ public void afterCreateConnections(final GlobalClockRule rule, final
DatabaseType databaseType, final Collection<Connection> connections,
+ final TransactionConnectionContext
transactionContext) throws SQLException {
+ if (!rule.getConfiguration().isEnabled()) {
return;
}
-
transactionContext.setBeginMills(globalClockProvider.getCurrentTimestamp());
- }
-
- @Override
- public void afterCreateConnections(final Collection<Connection>
connections, final TransactionConnectionContext transactionContext) throws
SQLException {
- if (!enabled) {
- return;
+ Optional<GlobalClockTransactionExecutor>
globalClockTransactionExecutor =
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class,
databaseType);
+ if (globalClockTransactionExecutor.isPresent()) {
+
globalClockTransactionExecutor.get().sendSnapshotTimestamp(connections,
transactionContext.getBeginMills());
}
- globalClockTransactionExecutor.sendSnapshotTimestamp(connections,
transactionContext.getBeginMills());
}
@Override
- public void beforeExecuteSQL(final Collection<Connection> connections,
final TransactionConnectionContext connectionContext, final
TransactionIsolationLevel isolationLevel) throws SQLException {
- if (!enabled) {
+ public void beforeExecuteSQL(final GlobalClockRule rule, final
DatabaseType databaseType, final Collection<Connection> connections, final
TransactionConnectionContext connectionContext,
+ final TransactionIsolationLevel
isolationLevel) throws SQLException {
+ if (!rule.getConfiguration().isEnabled()) {
return;
}
if (null == isolationLevel || TransactionIsolationLevel.READ_COMMITTED
== isolationLevel) {
- globalClockTransactionExecutor.sendSnapshotTimestamp(connections,
globalClockProvider.getCurrentTimestamp());
+ Optional<GlobalClockTransactionExecutor>
globalClockTransactionExecutor =
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class,
databaseType);
+ Optional<GlobalClockProvider> globalClockProvider =
rule.getGlobalClockProvider();
+ if (globalClockTransactionExecutor.isPresent() &&
globalClockProvider.isPresent()) {
+
globalClockTransactionExecutor.get().sendSnapshotTimestamp(connections,
globalClockProvider.get().getCurrentTimestamp());
+ }
}
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
- public void beforeCommit(final Collection<Connection> connections, final
TransactionConnectionContext transactionContext, final LockContext lockContext)
throws SQLException {
- if (!enabled) {
+ public void beforeCommit(final GlobalClockRule rule, final DatabaseType
databaseType, final Collection<Connection> connections, final
TransactionConnectionContext transactionContext,
+ final LockContext lockContext) throws
SQLException {
+ if (!rule.getConfiguration().isEnabled()) {
return;
}
if (lockContext.tryLock(lockDefinition, 200L)) {
- globalClockTransactionExecutor.sendCommitTimestamp(connections,
globalClockProvider.getCurrentTimestamp());
+ Optional<GlobalClockTransactionExecutor>
globalClockTransactionExecutor =
DatabaseTypedSPILoader.findService(GlobalClockTransactionExecutor.class,
databaseType);
+ Optional<GlobalClockProvider> globalClockProvider =
rule.getGlobalClockProvider();
+ if (globalClockTransactionExecutor.isPresent() &&
globalClockProvider.isPresent()) {
+
globalClockTransactionExecutor.get().sendCommitTimestamp(connections,
globalClockProvider.get().getCurrentTimestamp());
+ }
}
}
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
- public void afterCommit(final Collection<Connection> connections, final
TransactionConnectionContext transactionContext, final LockContext lockContext)
{
- if (!enabled) {
+ public void afterCommit(final GlobalClockRule rule, final DatabaseType
databaseType, final Collection<Connection> connections, final
TransactionConnectionContext transactionContext,
+ final LockContext lockContext) {
+ Optional<GlobalClockProvider> globalClockProvider =
rule.getGlobalClockProvider();
+ if (!globalClockProvider.isPresent()) {
return;
}
try {
- globalClockProvider.getNextTimestamp();
+ globalClockProvider.get().getNextTimestamp();
} finally {
lockContext.unlock(lockDefinition);
}
}
@Override
- public void beforeRollback(final Collection<Connection> connections, final
TransactionConnectionContext transactionContext) throws SQLException {
+ public void beforeRollback(final GlobalClockRule rule, final DatabaseType
databaseType, final Collection<Connection> connections,
+ final TransactionConnectionContext
transactionContext) throws SQLException {
+ }
+
+ @Override
+ public void afterRollback(final GlobalClockRule rule, final DatabaseType
databaseType, final Collection<Connection> connections,
+ final TransactionConnectionContext
transactionContext) throws SQLException {
}
@Override
- public void afterRollback(final Collection<Connection> connections, final
TransactionConnectionContext transactionContext) throws SQLException {
+ public int getOrder() {
+ return GlobalClockOrder.ORDER;
}
@Override
- public String getType() {
- return "GLOBAL_CLOCK";
+ public Class<GlobalClockRule> getTypeClass() {
+ return GlobalClockRule.class;
}
}
diff --git
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
index 0bf2aeaf03e..a20512e8746 100644
---
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
+++
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/GlobalClockRule.java
@@ -20,62 +20,34 @@ package org.apache.shardingsphere.globalclock.rule;
import lombok.Getter;
import
org.apache.shardingsphere.globalclock.config.GlobalClockRuleConfiguration;
import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
-import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.transaction.spi.TransactionHook;
-import java.util.Collection;
-import java.util.Map;
import java.util.Optional;
-import java.util.Properties;
/**
* Global clock rule.
*/
+@Getter
public final class GlobalClockRule implements GlobalRule {
- @Getter
private final GlobalClockRuleConfiguration configuration;
- private final GlobalClockProvider provider;
+ private final GlobalClockProvider globalClockProvider;
- public GlobalClockRule(final GlobalClockRuleConfiguration ruleConfig,
final Map<String, ShardingSphereDatabase> databases) {
+ public GlobalClockRule(final GlobalClockRuleConfiguration ruleConfig) {
configuration = ruleConfig;
- if (ruleConfig.isEnabled()) {
- provider = TypedSPILoader.getService(GlobalClockProvider.class,
getGlobalClockProviderType(), configuration.getProps());
- TypedSPILoader.getService(TransactionHook.class, "GLOBAL_CLOCK",
createProperties(databases));
- } else {
- provider = null;
- }
- }
-
- private String getGlobalClockProviderType() {
- return String.join(".", configuration.getType(),
configuration.getProvider());
- }
-
- private Properties createProperties(final Map<String,
ShardingSphereDatabase> databases) {
- Properties result = new Properties();
- DatabaseType storageType =
findStorageType(databases.values()).orElseGet(DatabaseTypeEngine::getDefaultStorageType);
- result.setProperty("trunkType",
storageType.getTrunkDatabaseType().orElse(storageType).getType());
- result.setProperty("type", configuration.getType());
- result.setProperty("provider", configuration.getProvider());
- return result;
- }
-
- private Optional<DatabaseType> findStorageType(final
Collection<ShardingSphereDatabase> databases) {
- return databases.stream().flatMap(each ->
each.getResourceMetaData().getStorageUnits().values().stream()).findFirst().map(StorageUnit::getStorageType);
+ globalClockProvider = ruleConfig.isEnabled()
+ ? TypedSPILoader.getService(GlobalClockProvider.class,
String.join(".", ruleConfig.getType(), ruleConfig.getProvider()),
configuration.getProps())
+ : null;
}
/**
- * Get current timestamp.
+ * Get global clock provider.
*
- * @return current timestamp
+ * @return global clock provider
*/
- public long getCurrentTimestamp() {
- return null == provider ? 0L : provider.getCurrentTimestamp();
+ public Optional<GlobalClockProvider> getGlobalClockProvider() {
+ return Optional.ofNullable(globalClockProvider);
}
}
diff --git
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
index f490549210a..79e9bba3e1e 100644
---
a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
+++
b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/rule/builder/GlobalClockRuleBuilder.java
@@ -33,7 +33,7 @@ public final class GlobalClockRuleBuilder implements
GlobalRuleBuilder<GlobalClo
@Override
public GlobalClockRule build(final GlobalClockRuleConfiguration
ruleConfig, final Map<String, ShardingSphereDatabase> databases, final
ConfigurationProperties props) {
- return new GlobalClockRule(ruleConfig, databases);
+ return new GlobalClockRule(ruleConfig);
}
@Override
diff --git
a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
index 43b60311236..656a4821397 100644
---
a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
+++
b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java
@@ -17,10 +17,12 @@
package org.apache.shardingsphere.transaction.spi;
-import
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.lock.LockContext;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPI;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
import java.sql.Connection;
@@ -29,80 +31,99 @@ import java.util.Collection;
/**
* ShardingSphere transaction hook.
+ *
+ * @param <T> type of rule
*/
@SingletonSPI
-public interface TransactionHook extends TypedSPI {
+public interface TransactionHook<T extends ShardingSphereRule> extends
OrderedSPI<T> {
/**
* Process before opening the transaction.
*
+ * @param rule rule
+ * @param databaseType database type
* @param transactionContext transaction context
*/
- void beforeBegin(TransactionConnectionContext transactionContext);
+ void beforeBegin(T rule, DatabaseType databaseType,
TransactionConnectionContext transactionContext);
/**
* Process after opening the transaction.
*
+ * @param rule rule
+ * @param databaseType database type
* @param transactionContext transaction context
*/
- void afterBegin(TransactionConnectionContext transactionContext);
+ void afterBegin(T rule, DatabaseType databaseType,
TransactionConnectionContext transactionContext);
/**
* Process after connection is created.
*
+ * @param rule rule
+ * @param databaseType database type
* @param connections connections
* @param transactionContext transaction context
* @throws SQLException SQL exception
*/
- void afterCreateConnections(Collection<Connection> connections,
TransactionConnectionContext transactionContext) throws SQLException;
+ void afterCreateConnections(T rule, DatabaseType databaseType,
Collection<Connection> connections, TransactionConnectionContext
transactionContext) throws SQLException;
/**
- * Process before executing sql.
+ * Process before executing SQL.
*
+ * @param rule rule
+ * @param databaseType database type
* @param connections connections
* @param transactionContext transaction context
* @param isolationLevel isolation level
* @throws SQLException SQL exception
*/
- void beforeExecuteSQL(Collection<Connection> connections,
TransactionConnectionContext transactionContext, TransactionIsolationLevel
isolationLevel) throws SQLException;
+ void beforeExecuteSQL(T rule, DatabaseType databaseType,
Collection<Connection> connections, TransactionConnectionContext
transactionContext,
+ TransactionIsolationLevel isolationLevel) throws
SQLException;
/**
* Process before committing the transaction.
*
+ * @param rule rule
+ * @param databaseType database type
* @param connections connections
* @param transactionContext transaction context
* @param lockContext lock context
* @throws SQLException SQL exception
*/
@SuppressWarnings("rawtypes")
- void beforeCommit(Collection<Connection> connections,
TransactionConnectionContext transactionContext, LockContext lockContext)
throws SQLException;
+ void beforeCommit(T rule, DatabaseType databaseType,
Collection<Connection> connections, TransactionConnectionContext
transactionContext, LockContext lockContext) throws SQLException;
/**
* Process after committing the transaction.
*
+ * @param rule rule
+ * @param databaseType database type
* @param connections connections
* @param transactionContext transaction context
* @param lockContext lock context
* @throws SQLException SQL exception
*/
@SuppressWarnings("rawtypes")
- void afterCommit(Collection<Connection> connections,
TransactionConnectionContext transactionContext, LockContext lockContext)
throws SQLException;
+ void afterCommit(T rule, DatabaseType databaseType, Collection<Connection>
connections, TransactionConnectionContext transactionContext, LockContext
lockContext) throws SQLException;
/**
* Process before rolling back the transaction.
*
+ * @param rule rule
+ * @param databaseType database type
* @param connections connections
* @param transactionContext transaction context
* @throws SQLException SQL exception
*/
- void beforeRollback(Collection<Connection> connections,
TransactionConnectionContext transactionContext) throws SQLException;
+ void beforeRollback(T rule, DatabaseType databaseType,
Collection<Connection> connections, TransactionConnectionContext
transactionContext) throws SQLException;
/**
* Process after rolling back the transaction.
*
+ * @param rule rule
+ * @param databaseType database type
* @param connections connections
* @param transactionContext transaction context
* @throws SQLException SQL exception
*/
- void afterRollback(Collection<Connection> connections,
TransactionConnectionContext transactionContext) throws SQLException;
+ void afterRollback(T rule, DatabaseType databaseType,
Collection<Connection> connections, TransactionConnectionContext
transactionContext) throws SQLException;
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
index 81290d2003a..9ff69eb0ccd 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java
@@ -22,9 +22,11 @@ import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DatabaseConnectionManager;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
import
org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ConnectionPostProcessor;
import
org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ResourceLock;
import
org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction.BackendTransactionManager;
@@ -43,6 +45,8 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -67,7 +71,9 @@ public final class ProxyDatabaseConnectionManager implements
DatabaseConnectionM
private final AtomicBoolean closed = new AtomicBoolean(false);
- private final Collection<TransactionHook> transactionHooks =
ShardingSphereServiceLoader.getServiceInstances(TransactionHook.class);
+ @SuppressWarnings("rawtypes")
+ private final Map<ShardingSphereRule, TransactionHook> transactionHooks =
OrderedSPILoader.getServices(
+ TransactionHook.class,
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules());
@Override
public List<Connection> getConnections(final String databaseName, final
String dataSourceName, final int connectionOffset, final int connectionSize,
@@ -106,10 +112,12 @@ public final class ProxyDatabaseConnectionManager
implements DatabaseConnectionM
return databaseName.toLowerCase() + "." + dataSourceName;
}
+ @SuppressWarnings({"unchecked", "rawtypes"})
private void executeTransactionHooksAfterCreateConnections(final
List<Connection> connections) throws SQLException {
if (connectionSession.getTransactionStatus().isInTransaction()) {
- for (TransactionHook each : transactionHooks) {
- each.afterCreateConnections(connections,
connectionSession.getConnectionContext().getTransactionContext());
+ DatabaseType databaseType =
ProxyContext.getInstance().getDatabaseType();
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().afterCreateConnections(entry.getKey(),
databaseType, connections,
connectionSession.getConnectionContext().getTransactionContext());
}
}
}
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 0e43235e9b1..332c2841186 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
@@ -46,7 +46,7 @@ import
org.apache.shardingsphere.infra.rule.attribute.raw.RawExecutionRuleAttrib
import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
import
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
import org.apache.shardingsphere.infra.session.query.QueryContext;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import
org.apache.shardingsphere.proxy.backend.connector.jdbc.executor.ProxyJDBCExecutor;
import
org.apache.shardingsphere.proxy.backend.connector.jdbc.statement.JDBCBackendStatement;
@@ -76,6 +76,8 @@ import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.Optional;
/**
@@ -94,7 +96,9 @@ public final class ProxySQLExecutor {
@Getter
private final SQLFederationEngine sqlFederationEngine;
- private final Collection<TransactionHook> transactionHooks =
ShardingSphereServiceLoader.getServiceInstances(TransactionHook.class);
+ @SuppressWarnings("rawtypes")
+ private final Map<ShardingSphereRule, TransactionHook> transactionHooks =
OrderedSPILoader.getServices(
+ TransactionHook.class,
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules());
public ProxySQLExecutor(final String type, final
ProxyDatabaseConnectionManager databaseConnectionManager, final
DatabaseConnector databaseConnector, final QueryContext queryContext) {
this.type = type;
@@ -105,9 +109,9 @@ public final class ProxySQLExecutor {
regularExecutor = new ProxyJDBCExecutor(type,
databaseConnectionManager.getConnectionSession(), databaseConnector,
jdbcExecutor);
rawExecutor = new RawExecutor(executorEngine, connectionContext);
MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
- String currentDatabaseName =
-
Strings.isNullOrEmpty(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName())
? databaseConnectionManager.getConnectionSession().getUsedDatabaseName()
- :
databaseConnectionManager.getConnectionSession().getCurrentDatabaseName();
+ String currentDatabaseName =
Strings.isNullOrEmpty(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName())
+ ?
databaseConnectionManager.getConnectionSession().getUsedDatabaseName()
+ :
databaseConnectionManager.getConnectionSession().getCurrentDatabaseName();
String currentSchemaName =
getSchemaName(queryContext.getSqlStatementContext(),
metaDataContexts.getMetaData().getDatabase(currentDatabaseName));
sqlFederationEngine = new SQLFederationEngine(currentDatabaseName,
currentSchemaName, metaDataContexts.getMetaData(),
metaDataContexts.getStatistics(), jdbcExecutor);
}
@@ -233,12 +237,14 @@ public final class ProxySQLExecutor {
return regularExecutor.execute(executionContext.getQueryContext(),
executionGroupContext, isReturnGeneratedKeys, isExceptionThrown);
}
+ @SuppressWarnings({"unchecked", "rawtypes"})
private void executeTransactionHooksBeforeExecuteSQL(final
ConnectionSession connectionSession) throws SQLException {
if (!getTransactionContext(connectionSession).isInTransaction()) {
return;
}
- for (TransactionHook each : transactionHooks) {
-
each.beforeExecuteSQL(connectionSession.getDatabaseConnectionManager().getCachedConnections().values(),
getTransactionContext(connectionSession),
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().beforeExecuteSQL(entry.getKey(),
ProxyContext.getInstance().getDatabaseType(),
+
connectionSession.getDatabaseConnectionManager().getCachedConnections().values(),
getTransactionContext(connectionSession),
connectionSession.getIsolationLevel().orElse(TransactionIsolationLevel.READ_COMMITTED));
}
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
index 73425a63dec..4cc7f78c3f6 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
@@ -17,8 +17,10 @@
package org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
import
org.apache.shardingsphere.proxy.backend.connector.ProxyDatabaseConnectionManager;
import org.apache.shardingsphere.proxy.backend.connector.TransactionManager;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -35,10 +37,13 @@ import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
/**
* Backend transaction manager.
*/
+@SuppressWarnings({"rawtypes", "unchecked"})
public final class BackendTransactionManager implements TransactionManager {
private final ProxyDatabaseConnectionManager connection;
@@ -49,7 +54,7 @@ public final class BackendTransactionManager implements
TransactionManager {
private final ShardingSphereDistributionTransactionManager
distributionTransactionManager;
- private final Collection<TransactionHook> transactionHooks;
+ private final Map<ShardingSphereRule, TransactionHook> transactionHooks;
public BackendTransactionManager(final ProxyDatabaseConnectionManager
databaseConnectionManager) {
connection = databaseConnectionManager;
@@ -58,7 +63,7 @@ public final class BackendTransactionManager implements
TransactionManager {
transactionType = transactionRule.getDefaultType();
ShardingSphereTransactionManagerEngine engine =
transactionRule.getResource();
distributionTransactionManager = null == engine ? null :
engine.getTransactionManager(transactionType);
- transactionHooks =
ShardingSphereServiceLoader.getServiceInstances(TransactionHook.class);
+ transactionHooks = OrderedSPILoader.getServices(TransactionHook.class,
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules());
}
@Override
@@ -69,23 +74,26 @@ public final class BackendTransactionManager implements
TransactionManager {
connection.closeHandlers(true);
connection.closeConnections(false);
}
- for (TransactionHook each : transactionHooks) {
- each.beforeBegin(getTransactionContext());
+ DatabaseType databaseType =
ProxyContext.getInstance().getDatabaseType();
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().beforeBegin(entry.getKey(), databaseType,
getTransactionContext());
}
if (TransactionType.LOCAL == transactionType || null ==
distributionTransactionManager) {
localTransactionManager.begin();
} else {
distributionTransactionManager.begin();
}
- for (TransactionHook each : transactionHooks) {
- each.afterBegin(getTransactionContext());
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().afterBegin(entry.getKey(), databaseType,
getTransactionContext());
}
}
@Override
public void commit() throws SQLException {
- for (TransactionHook each : transactionHooks) {
- each.beforeCommit(connection.getCachedConnections().values(),
getTransactionContext(),
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
+ DatabaseType databaseType =
ProxyContext.getInstance().getDatabaseType();
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().beforeCommit(entry.getKey(), databaseType,
+ connection.getCachedConnections().values(),
getTransactionContext(),
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
}
if
(connection.getConnectionSession().getTransactionStatus().isInTransaction()) {
try {
@@ -95,9 +103,9 @@ public final class BackendTransactionManager implements
TransactionManager {
distributionTransactionManager.commit(getTransactionContext().isExceptionOccur());
}
} finally {
- for (TransactionHook each : transactionHooks) {
-
each.afterCommit(connection.getCachedConnections().values(),
- getTransactionContext(),
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().afterCommit(entry.getKey(), databaseType,
+ connection.getCachedConnections().values(),
getTransactionContext(),
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
}
for (Connection each :
connection.getCachedConnections().values()) {
ConnectionSavepointManager.getInstance().transactionFinished(each);
@@ -110,8 +118,9 @@ public final class BackendTransactionManager implements
TransactionManager {
@Override
public void rollback() throws SQLException {
- for (TransactionHook each : transactionHooks) {
- each.beforeRollback(connection.getCachedConnections().values(),
getTransactionContext());
+ DatabaseType databaseType =
ProxyContext.getInstance().getDatabaseType();
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().beforeRollback(entry.getKey(), databaseType,
connection.getCachedConnections().values(), getTransactionContext());
}
if
(connection.getConnectionSession().getTransactionStatus().isInTransaction()) {
try {
@@ -121,8 +130,8 @@ public final class BackendTransactionManager implements
TransactionManager {
distributionTransactionManager.rollback();
}
} finally {
- for (TransactionHook each : transactionHooks) {
-
each.afterRollback(connection.getCachedConnections().values(),
getTransactionContext());
+ for (Entry<ShardingSphereRule, TransactionHook> entry :
transactionHooks.entrySet()) {
+ entry.getValue().afterRollback(entry.getKey(),
databaseType, connection.getCachedConnections().values(),
getTransactionContext());
}
for (Connection each :
connection.getCachedConnections().values()) {
ConnectionSavepointManager.getInstance().transactionFinished(each);
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
index d8eab13a62b..bf9c52cef91 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/context/ProxyContext.java
@@ -20,7 +20,10 @@ package org.apache.shardingsphere.proxy.backend.context;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import org.apache.shardingsphere.infra.state.instance.InstanceStateContext;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.proxy.backend.connector.jdbc.datasource.JDBCBackendDataSource;
@@ -87,4 +90,15 @@ public final class ProxyContext {
public Optional<InstanceStateContext> getInstanceStateContext() {
return null == contextManager.getComputeNodeInstanceContext() ?
Optional.empty() :
Optional.ofNullable(contextManager.getComputeNodeInstanceContext().getInstance().getState());
}
+
+ /**
+ * Get database type.
+ *
+ * @return database type
+ */
+ public DatabaseType getDatabaseType() {
+ Collection<ShardingSphereDatabase> databases =
contextManager.getMetaDataContexts().getMetaData().getDatabases().values();
+ return databases.stream().flatMap(each ->
each.getResourceMetaData().getStorageUnits().values().stream()).findFirst().map(StorageUnit::getStorageType)
+ .orElseGet(DatabaseTypeEngine::getDefaultStorageType);
+ }
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
index dc038d9a6d8..669facdf74a 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
import org.apache.commons.codec.binary.Base64;
import
org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor;
import
org.apache.shardingsphere.distsql.statement.ral.queryable.export.ExportMetaDataStatement;
+import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
import org.apache.shardingsphere.globalclock.rule.GlobalClockRule;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
@@ -128,7 +129,7 @@ public final class ExportMetaDataExecutor implements
DistSQLQueryExecutor<Export
GlobalClockRule globalClockRule =
metaData.getGlobalRuleMetaData().getSingleRule(GlobalClockRule.class);
if (globalClockRule.getConfiguration().isEnabled()) {
ExportedSnapshotInfo snapshotInfo = new ExportedSnapshotInfo();
-
snapshotInfo.setCsn(String.valueOf(globalClockRule.getCurrentTimestamp()));
+
snapshotInfo.setCsn(String.valueOf(globalClockRule.getGlobalClockProvider().map(GlobalClockProvider::getCurrentTimestamp).orElse(0L)));
snapshotInfo.setCreateTime(LocalDateTime.now());
exportedClusterInfo.setSnapshotInfo(snapshotInfo);
}
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
index 9c011012170..9ff5f8de1b3 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
@@ -195,7 +195,7 @@ class BackendTransactionManagerTest {
@SneakyThrows(ReflectiveOperationException.class)
private void setTransactionHooks() {
-
Plugins.getMemberAccessor().set(BackendTransactionManager.class.getDeclaredField("transactionHooks"),
backendTransactionManager, Collections.emptyList());
+
Plugins.getMemberAccessor().set(BackendTransactionManager.class.getDeclaredField("transactionHooks"),
backendTransactionManager, Collections.emptyMap());
}
private ContextManager mockContextManager(final TransactionType
transactionType) {
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
index f4bd3990e3e..b733fec5356 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
@@ -127,8 +127,7 @@ class ExportMetaDataExecutorTest {
private ContextManager mockEmptyContextManager() {
ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
MetaDataContexts metaDataContexts =
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new
ShardingSphereMetaData(new HashMap<>(),
- new ResourceMetaData(Collections.emptyMap()), new
RuleMetaData(Collections.singletonList(
- new GlobalClockRule(new
DefaultGlobalClockRuleConfigurationBuilder().build(), Collections.emptyMap()))),
+ new ResourceMetaData(Collections.emptyMap()), new
RuleMetaData(Collections.singletonList(new GlobalClockRule(new
DefaultGlobalClockRuleConfigurationBuilder().build()))),
new ConfigurationProperties(new Properties())));
when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
return result;
@@ -166,7 +165,7 @@ class ExportMetaDataExecutorTest {
MetaDataContexts metaDataContexts =
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new
ShardingSphereMetaData(Collections.singletonMap(database.getName(), database),
new ResourceMetaData(Collections.emptyMap()),
new RuleMetaData(Arrays.asList(new AuthorityRule(new
DefaultAuthorityRuleConfigurationBuilder().build()),
- new GlobalClockRule(new
DefaultGlobalClockRuleConfigurationBuilder().build(),
Collections.singletonMap(database.getName(), database)))),
+ new GlobalClockRule(new
DefaultGlobalClockRuleConfigurationBuilder().build()))),
new ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true")))));
ComputeNodeInstanceContext computeNodeInstanceContext = new
ComputeNodeInstanceContext(
new ComputeNodeInstance(mock(InstanceMetaData.class)), new
StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null),
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
index 4c82ef2e409..6e236c9b28b 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableUpdatableRALBackendHandlerTest.java
@@ -21,20 +21,29 @@ import io.netty.util.DefaultAttributeMap;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.SetDistVariableStatement;
import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
import
org.apache.shardingsphere.infra.exception.kernel.syntax.UnsupportedVariableException;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.handler.distsql.DistSQLUpdateBackendHandler;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
class SetDistVariableUpdatableRALBackendHandlerTest {
private ConnectionSession connectionSession;
@BeforeEach
void setUp() {
+ when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class,
RETURNS_DEEP_STUBS));
connectionSession = new
ConnectionSession(mock(MySQLDatabaseType.class), new DefaultAttributeMap());
}
diff --git
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
index d5711f60b9b..b145831c38d 100644
---
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
+++
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionIsolationValueProviderTest.java
@@ -20,17 +20,32 @@ package
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sys
import io.netty.util.DefaultAttributeMap;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.MySQLSystemVariable;
import
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
class TransactionIsolationValueProviderTest {
+ @BeforeEach
+ void setUp() {
+ when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class,
RETURNS_DEEP_STUBS));
+ }
+
@Test
void assertGetGlobalValue() {
assertThat(new TransactionIsolationValueProvider().get(Scope.GLOBAL,
null, MySQLSystemVariable.TRANSACTION_ISOLATION), is("REPEATABLE-READ"));
diff --git
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
index 470b250542b..adebc2cf265 100644
---
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
+++
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/TransactionReadOnlyValueProviderTest.java
@@ -20,16 +20,31 @@ package
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sys
import io.netty.util.DefaultAttributeMap;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.MySQLSystemVariable;
import
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
class TransactionReadOnlyValueProviderTest {
+ @BeforeEach
+ void setUp() {
+ when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class,
RETURNS_DEEP_STUBS));
+ }
+
@Test
void assertGetGlobalValue() {
assertThat(new TransactionReadOnlyValueProvider().get(Scope.GLOBAL,
null, MySQLSystemVariable.TX_READ_ONLY), is("0"));
diff --git
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
index 593cd5d8f0d..7da19bde35a 100644
---
a/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
+++
b/proxy/backend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/sysvar/provider/VersionValueProviderTest.java
@@ -21,18 +21,33 @@ import io.netty.util.DefaultAttributeMap;
import
org.apache.shardingsphere.db.protocol.constant.DatabaseProtocolServerInfo;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.MySQLSystemVariable;
import
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.sysvar.Scope;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ProxyContext.class)
class VersionValueProviderTest {
+ @BeforeEach
+ void setUp() {
+ when(ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class,
RETURNS_DEEP_STUBS));
+ }
+
@Test
void assertGetValue() {
DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "MySQL");