Commit d75c9ead authored by terrymanu's avatar terrymanu
Browse files

merge xa and local trans's exec

parent 70e65219
Loading
Loading
Loading
Loading
+6 −29
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@

package io.shardingsphere.proxy.backend.jdbc.execute.memory;

import io.shardingsphere.core.constant.transaction.TransactionType;
import io.shardingsphere.core.executor.ShardingGroupExecuteCallback;
import io.shardingsphere.core.merger.QueryResult;
import io.shardingsphere.core.routing.SQLRouteResult;
@@ -31,7 +30,6 @@ import io.shardingsphere.proxy.backend.jdbc.execute.response.ExecuteUpdateRespon
import io.shardingsphere.proxy.backend.jdbc.execute.response.unit.ExecuteQueryResponseUnit;
import io.shardingsphere.proxy.backend.jdbc.execute.response.unit.ExecuteResponseUnit;
import io.shardingsphere.proxy.backend.jdbc.wrapper.JDBCExecutorWrapper;
import io.shardingsphere.proxy.config.RuleRegistry;
import lombok.RequiredArgsConstructor;

import java.sql.Connection;
@@ -59,18 +57,12 @@ public final class ConnectionStrictlyExecuteEngine extends JDBCExecuteEngine {
    @Override
    public ExecuteResponse execute(final SQLRouteResult routeResult, final boolean isReturnGeneratedKeys) throws SQLException {
        Map<String, Collection<SQLUnit>> sqlUnitGroups = routeResult.getSQLUnitGroups();
        Collection<ExecuteResponseUnit> executeResponseUnits;
        if (TransactionType.XA == RuleRegistry.getInstance().getTransactionType()) {
        Map<String, Map<SQLUnit, Statement>> sqlUnitStatements = new HashMap<>(sqlUnitGroups.size(), 1);
        for (Entry<String, Collection<SQLUnit>> entry : sqlUnitGroups.entrySet()) {
            sqlUnitStatements.put(entry.getKey(), createSQLUnitStatement(entry.getKey(), entry.getValue(), isReturnGeneratedKeys));
        }
            executeResponseUnits = BackendExecutorContext.getInstance().getExecuteEngine().groupExecute(
                    sqlUnitGroups, new FirstTransactionGroupExecuteCallback(isReturnGeneratedKeys), new XATransactionGroupExecuteCallback(isReturnGeneratedKeys, sqlUnitStatements));
        } else {
            executeResponseUnits = BackendExecutorContext.getInstance().getExecuteEngine().groupExecute(
                    sqlUnitGroups, new FirstTransactionGroupExecuteCallback(isReturnGeneratedKeys), new LocalTransactionGroupExecuteCallback(isReturnGeneratedKeys));
        }
        Collection<ExecuteResponseUnit> executeResponseUnits = BackendExecutorContext.getInstance().getExecuteEngine().groupExecute(
                sqlUnitGroups, new FirstTransactionGroupExecuteCallback(isReturnGeneratedKeys), new TransactionGroupExecuteCallback(isReturnGeneratedKeys, sqlUnitStatements));
        return getExecuteQueryResponse(executeResponseUnits);
    }
    
@@ -137,7 +129,7 @@ public final class ConnectionStrictlyExecuteEngine extends JDBCExecuteEngine {
    }
    
    @RequiredArgsConstructor
    class XATransactionGroupExecuteCallback implements ShardingGroupExecuteCallback<SQLUnit, ExecuteResponseUnit> {
    class TransactionGroupExecuteCallback implements ShardingGroupExecuteCallback<SQLUnit, ExecuteResponseUnit> {
    
        private final boolean isReturnGeneratedKeys;
    
@@ -152,19 +144,4 @@ public final class ConnectionStrictlyExecuteEngine extends JDBCExecuteEngine {
            return result;
        }
    }
    
    @RequiredArgsConstructor
    class LocalTransactionGroupExecuteCallback implements ShardingGroupExecuteCallback<SQLUnit, ExecuteResponseUnit> {
    
        private final boolean isReturnGeneratedKeys;
        
        @Override
        public Collection<ExecuteResponseUnit> execute(final String dataSourceName, final Collection<SQLUnit> sqlUnits) throws SQLException {
            Collection<ExecuteResponseUnit> result = new LinkedList<>();
            for (Entry<SQLUnit, Statement> each : createSQLUnitStatement(dataSourceName, sqlUnits, isReturnGeneratedKeys).entrySet()) {
                result.add(executeWithoutMetadata(each.getValue(), each.getKey().getSql(), isReturnGeneratedKeys));
            }
            return result;
        }
    }
}
+6 −27
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@

package io.shardingsphere.proxy.backend.jdbc.execute.stream;

import io.shardingsphere.core.constant.transaction.TransactionType;
import io.shardingsphere.core.executor.ShardingExecuteCallback;
import io.shardingsphere.core.merger.QueryResult;
import io.shardingsphere.core.routing.SQLExecutionUnit;
@@ -31,7 +30,6 @@ import io.shardingsphere.proxy.backend.jdbc.execute.response.ExecuteUpdateRespon
import io.shardingsphere.proxy.backend.jdbc.execute.response.unit.ExecuteQueryResponseUnit;
import io.shardingsphere.proxy.backend.jdbc.execute.response.unit.ExecuteResponseUnit;
import io.shardingsphere.proxy.backend.jdbc.wrapper.JDBCExecutorWrapper;
import io.shardingsphere.proxy.config.RuleRegistry;
import lombok.RequiredArgsConstructor;

import java.sql.ResultSet;
@@ -57,18 +55,12 @@ public final class MemoryStrictlyExecuteEngine extends JDBCExecuteEngine {
    
    @Override
    public ExecuteResponse execute(final SQLRouteResult routeResult, final boolean isReturnGeneratedKeys) throws SQLException {
        Collection<ExecuteResponseUnit> executeResponseUnits;
        if (TransactionType.XA == RuleRegistry.getInstance().getTransactionType()) {
        Map<SQLExecutionUnit, Statement> statements = new HashMap<>(routeResult.getExecutionUnits().size(), 1);
        for (SQLExecutionUnit each : routeResult.getExecutionUnits()) {
            statements.put(each, getJdbcExecutorWrapper().createStatement(getBackendConnection().getConnection(each.getDataSource()), each.getSqlUnit().getSql(), isReturnGeneratedKeys));
        }
            executeResponseUnits = BackendExecutorContext.getInstance().getExecuteEngine().execute(
                    routeResult.getExecutionUnits(), new FirstTransactionExecuteCallback(isReturnGeneratedKeys), new XATransactionExecuteCallback(isReturnGeneratedKeys, statements));
        } else {
            executeResponseUnits = BackendExecutorContext.getInstance().getExecuteEngine().execute(
                    routeResult.getExecutionUnits(), new FirstTransactionExecuteCallback(isReturnGeneratedKeys), new LocalTransactionExecuteCallback(isReturnGeneratedKeys));
        }
        Collection<ExecuteResponseUnit> executeResponseUnits = BackendExecutorContext.getInstance().getExecuteEngine().execute(
                routeResult.getExecutionUnits(), new FirstTransactionExecuteCallback(isReturnGeneratedKeys), new TransactionExecuteCallback(isReturnGeneratedKeys, statements));
        ExecuteResponseUnit firstExecuteResponseUnit = executeResponseUnits.iterator().next();
        return firstExecuteResponseUnit instanceof ExecuteQueryResponseUnit
                ? getExecuteQueryResponse((ExecuteQueryResponseUnit) firstExecuteResponseUnit, executeResponseUnits) : getExecuteUpdateResponse(executeResponseUnits);
@@ -110,7 +102,7 @@ public final class MemoryStrictlyExecuteEngine extends JDBCExecuteEngine {
    }
    
    @RequiredArgsConstructor
    class XATransactionExecuteCallback implements ShardingExecuteCallback<SQLExecutionUnit, ExecuteResponseUnit> {
    class TransactionExecuteCallback implements ShardingExecuteCallback<SQLExecutionUnit, ExecuteResponseUnit> {
        
        private final boolean isReturnGeneratedKeys;
        
@@ -122,17 +114,4 @@ public final class MemoryStrictlyExecuteEngine extends JDBCExecuteEngine {
            return executeWithoutMetadata(statements.get(sqlExecutionUnit), actualSQL, isReturnGeneratedKeys);
        }
    }
    
    @RequiredArgsConstructor
    class LocalTransactionExecuteCallback implements ShardingExecuteCallback<SQLExecutionUnit, ExecuteResponseUnit> {
        
        private final boolean isReturnGeneratedKeys;
        
        @Override
        public ExecuteResponseUnit execute(final SQLExecutionUnit sqlExecutionUnit) throws SQLException {
            String actualSQL = sqlExecutionUnit.getSqlUnit().getSql();
            Statement statement = getJdbcExecutorWrapper().createStatement(getBackendConnection().getConnection(sqlExecutionUnit.getDataSource()), actualSQL, isReturnGeneratedKeys);
            return executeWithoutMetadata(statement, actualSQL, isReturnGeneratedKeys);
        }
    }
}