Commit d4a07d3f authored by terrymanu's avatar terrymanu
Browse files

refactor JDBCStatementBackendHandler & JDBCTextBackendHandler

parent 0d14b454
Loading
Loading
Loading
Loading
+13 −16
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@

package io.shardingsphere.proxy.backend.common.jdbc;

import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.constant.SQLType;
import io.shardingsphere.core.constant.TransactionType;
import io.shardingsphere.core.exception.ShardingException;
@@ -87,27 +86,25 @@ public abstract class JDBCBackendHandler implements BackendHandler {
    
    private boolean hasMoreResultValueFlag;
    
    private final DatabaseType databaseType;
    
    private final boolean showSQL;
    
    private final BaseJDBCResource jdbcResource;
    
    private final List<ResultList> resultLists = new CopyOnWriteArrayList<>();
    private final RuleRegistry ruleRegistry;
    
    private final List<ResultList> resultLists;
    
    public JDBCBackendHandler(final String sql, final DatabaseType databaseType, final boolean showSQL, final BaseJDBCResource jdbcResource) {
    public JDBCBackendHandler(final String sql, final BaseJDBCResource jdbcResource) {
        this.sql = sql;
        isMerged = false;
        hasMoreResultValueFlag = true;
        this.databaseType = databaseType;
        this.showSQL = showSQL;
        this.jdbcResource = jdbcResource;
        ruleRegistry = RuleRegistry.getInstance();
        resultLists = new CopyOnWriteArrayList<>();
    }
    
    @Override
    public CommandResponsePackets execute() {
        try {
            return doExecuteInternal(RuleRegistry.getInstance().isMasterSlaveOnly() ? doMasterSlaveRoute() : doSqlShardingRoute());
            return doExecuteInternal(ruleRegistry.isMasterSlaveOnly() ? doMasterSlaveRoute() : doSqlShardingRoute());
        } catch (final Exception ex) {
            log.error("ExecuteBackendHandler", ex);
            return new CommandResponsePackets(new ErrPacket(1, new SQLException(ex)));
@@ -121,7 +118,7 @@ public abstract class JDBCBackendHandler implements BackendHandler {
        if (isXaDDL(routeResult)) {
            throw new SQLException("DDL command can't not execute in xa transaction mode.");
        }
        ExecutorService executorService = RuleRegistry.getInstance().getExecutorService();
        ExecutorService executorService = ruleRegistry.getExecutorService();
        List<Future<CommandResponsePackets>> futureList = new ArrayList<>(1024);
        for (SQLExecutionUnit each : routeResult.getExecutionUnits()) {
            Statement statement = prepareResource(each.getDataSource(), each.getSqlUnit().getSql(), routeResult.getSqlStatement());
@@ -129,21 +126,21 @@ public abstract class JDBCBackendHandler implements BackendHandler {
        }
        List<CommandResponsePackets> packets = buildCommandResponsePackets(futureList);
        CommandResponsePackets result = merge(routeResult.getSqlStatement(), packets);
        if (!RuleRegistry.getInstance().isMasterSlaveOnly()) {
        if (!ruleRegistry.isMasterSlaveOnly()) {
            ProxyShardingRefreshHandler.build(routeResult).execute();
        }
        return result;
    }
    
    private boolean isXaDDL(final SQLRouteResult routeResult) throws SystemException {
        return TransactionType.XA.equals(RuleRegistry.getInstance().getTransactionType())
        return TransactionType.XA.equals(ruleRegistry.getTransactionType())
                && SQLType.DDL.equals(routeResult.getSqlStatement().getType()) && Status.STATUS_NO_TRANSACTION != AtomikosUserTransaction.getInstance().getStatus();
    }
    
    private SQLRouteResult doMasterSlaveRoute() {
        SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge();
        SQLRouteResult result = new SQLRouteResult(sqlStatement, null);
        String dataSourceName = new MasterSlaveRouter(RuleRegistry.getInstance().getMasterSlaveRule()).route(sqlStatement.getType()).iterator().next();
        String dataSourceName = new MasterSlaveRouter(ruleRegistry.getMasterSlaveRule()).route(sqlStatement.getType()).iterator().next();
        SQLUnit sqlUnit = new SQLUnit(sql, Collections.<List<Object>>emptyList());
        result.getExecutionUnits().add(new SQLExecutionUnit(dataSourceName, sqlUnit));
        return result;
@@ -205,7 +202,7 @@ public abstract class JDBCBackendHandler implements BackendHandler {
            queryResults.add(newQueryResult(packets.get(i), i));
        }
        try {
            mergedResult = MergeEngineFactory.newInstance(RuleRegistry.getInstance().getShardingRule(), queryResults, sqlStatement, RuleRegistry.getInstance().getShardingMetaData()).merge();
            mergedResult = MergeEngineFactory.newInstance(ruleRegistry.getShardingRule(), queryResults, sqlStatement, ruleRegistry.getShardingMetaData()).merge();
            isMerged = true;
        } catch (final SQLException ex) {
            return new CommandResponsePackets(new ErrPacket(1, ex));
@@ -262,7 +259,7 @@ public abstract class JDBCBackendHandler implements BackendHandler {
    
    protected Connection getConnection(final DataSource dataSource) throws SQLException {
        Connection result;
        if (ProxyMode.CONNECTION_STRICTLY == RuleRegistry.getInstance().getProxyMode()) {
        if (ProxyMode.CONNECTION_STRICTLY == ruleRegistry.getProxyMode()) {
            result = ProxyConnectionHolder.getConnection(dataSource);
            if (null == result) {
                result = dataSource.getConnection();
+11 −5
Original line number Diff line number Diff line
@@ -55,24 +55,30 @@ import java.util.concurrent.CopyOnWriteArrayList;
 */
public final class JDBCStatementBackendHandler extends JDBCBackendHandler {
    
    private final RuleRegistry ruleRegistry;
    
    private final List<PreparedStatementParameter> preparedStatementParameters;
    
    private final DatabaseType databaseType;
    
    private final boolean showSQL;
    
    @Getter
    private final List<ColumnType> columnTypes;
    
    private final RuleRegistry ruleRegistry;
    
    public JDBCStatementBackendHandler(final List<PreparedStatementParameter> preparedStatementParameters, final int statementId, final DatabaseType databaseType, final boolean showSQL) {
        super(PreparedStatementRegistry.getInstance().getSQL(statementId), databaseType, showSQL, ProxyJDBCResourceFactory.newPrepareResource());
        ruleRegistry = RuleRegistry.getInstance();
        super(PreparedStatementRegistry.getInstance().getSQL(statementId), ProxyJDBCResourceFactory.newPrepareResource());
        this.preparedStatementParameters = preparedStatementParameters;
        this.databaseType = databaseType;
        this.showSQL = showSQL;
        columnTypes = new CopyOnWriteArrayList<>();
        ruleRegistry = RuleRegistry.getInstance();
    }
    
    @Override
    protected SQLRouteResult doSqlShardingRoute() {
        PreparedStatementRoutingEngine routingEngine = new PreparedStatementRoutingEngine(
                getSql(), ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), getDatabaseType(), isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
                getSql(), ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), databaseType, showSQL, ruleRegistry.getShardingDataSourceMetaData());
        return routingEngine.route(getComStmtExecuteParameters());
    }
    
+8 −2
Original line number Diff line number Diff line
@@ -48,17 +48,23 @@ import java.util.concurrent.Callable;
 */
public final class JDBCTextBackendHandler extends JDBCBackendHandler {
   
    private final DatabaseType databaseType;
    
    private final boolean showSQL;
    
    private final RuleRegistry ruleRegistry;
    
    public JDBCTextBackendHandler(final String sql, final DatabaseType databaseType, final boolean showSQL) {
        super(sql, databaseType, showSQL, ProxyJDBCResourceFactory.newResource());
        super(sql, ProxyJDBCResourceFactory.newResource());
        this.databaseType = databaseType;
        this.showSQL = showSQL;
        ruleRegistry = RuleRegistry.getInstance();
    }
    
    @Override
    protected SQLRouteResult doSqlShardingRoute() {
        StatementRoutingEngine routingEngine = new StatementRoutingEngine(
                ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), getDatabaseType(), isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
                ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), databaseType, showSQL, ruleRegistry.getShardingDataSourceMetaData());
        return routingEngine.route(getSql());
    }