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 {