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 <[email protected]>
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 {

Reply via email to