You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by tu...@apache.org on 2023/03/22 09:34:35 UTC
[shardingsphere] branch master updated: Refactor DatabaseConnector for sql statement optimize (#24743)
This is an automated email from the ASF dual-hosted git repository.
tuichenchuxin 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 c3ca5b509c4 Refactor DatabaseConnector for sql statement optimize (#24743)
c3ca5b509c4 is described below
commit c3ca5b509c45001ba82ddb3e5c1371f9e165a8f0
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Wed Mar 22 17:34:21 2023 +0800
Refactor DatabaseConnector for sql statement optimize (#24743)
---
.../proxy/backend/connector/DatabaseConnector.java | 24 +++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
index a261fac31aa..145e632e108 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
@@ -177,12 +177,13 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
ResultSet resultSet = doExecuteFederation(queryContext, metaDataContexts);
return processExecuteFederation(resultSet, metaDataContexts);
}
- Collection<ExecutionContext> executionContexts = generateExecutionContexts(metaDataContexts);
- return isNeedImplicitCommitTransaction(executionContexts.iterator().next()) ? doExecuteWithImplicitCommitTransaction(executionContexts) : doExecute(executionContexts);
+ Collection<ExecutionContext> executionContexts = generateExecutionContexts();
+ return isNeedImplicitCommitTransaction(executionContexts) ? doExecuteWithImplicitCommitTransaction(executionContexts) : doExecute(executionContexts);
}
- private Collection<ExecutionContext> generateExecutionContexts(final MetaDataContexts metaDataContexts) {
+ private Collection<ExecutionContext> generateExecutionContexts() {
Collection<ExecutionContext> result = new LinkedList<>();
+ MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts();
ExecutionContext executionContext = new KernelProcessor().generateExecutionContext(queryContext, database, metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps(), backendConnection.getConnectionSession().getConnectionContext());
result.add(executionContext);
@@ -190,11 +191,20 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
return result;
}
- private boolean isNeedImplicitCommitTransaction(final ExecutionContext executionContext) {
+ private boolean isNeedImplicitCommitTransaction(final Collection<ExecutionContext> executionContexts) {
TransactionStatus transactionStatus = backendConnection.getConnectionSession().getTransactionStatus();
- SQLStatement sqlStatement = executionContext.getSqlStatementContext().getSqlStatement();
- return TransactionType.isDistributedTransaction(transactionStatus.getTransactionType()) && !transactionStatus.isInTransaction() && sqlStatement instanceof DMLStatement
- && !(sqlStatement instanceof SelectStatement) && executionContext.getExecutionUnits().size() > 1;
+ if (!TransactionType.isDistributedTransaction(transactionStatus.getTransactionType()) || transactionStatus.isInTransaction()) {
+ return false;
+ }
+ if (1 == executionContexts.size()) {
+ SQLStatement sqlStatement = executionContexts.iterator().next().getSqlStatementContext().getSqlStatement();
+ return isWriteDMLStatement(sqlStatement) && executionContexts.iterator().next().getExecutionUnits().size() > 1;
+ }
+ return executionContexts.stream().anyMatch(each -> isWriteDMLStatement(each.getSqlStatementContext().getSqlStatement()));
+ }
+
+ private static boolean isWriteDMLStatement(final SQLStatement sqlStatement) {
+ return sqlStatement instanceof DMLStatement && !(sqlStatement instanceof SelectStatement);
}
private ResponseHeader doExecuteWithImplicitCommitTransaction(final Collection<ExecutionContext> executionContexts) throws SQLException {