Commit 0d14b454 authored by terrymanu's avatar terrymanu
Browse files

refactor JDBCStatementBackendHandler & JDBCTextBackendHandler

parent 5e9ec613
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -91,17 +91,17 @@ public abstract class JDBCBackendHandler implements BackendHandler {
    
    private final boolean showSQL;
    
    @Setter
    private BaseJDBCResource jdbcResource;
    private final BaseJDBCResource jdbcResource;
    
    private final List<ResultList> resultLists = new CopyOnWriteArrayList<>();
    
    public JDBCBackendHandler(final String sql, final DatabaseType databaseType, final boolean showSQL) {
    public JDBCBackendHandler(final String sql, final DatabaseType databaseType, final boolean showSQL, final BaseJDBCResource jdbcResource) {
        this.sql = sql;
        isMerged = false;
        hasMoreResultValueFlag = true;
        this.databaseType = databaseType;
        this.showSQL = showSQL;
        this.jdbcResource = jdbcResource;
    }
    
    @Override
@@ -110,7 +110,7 @@ public abstract class JDBCBackendHandler implements BackendHandler {
            return doExecuteInternal(RuleRegistry.getInstance().isMasterSlaveOnly() ? doMasterSlaveRoute() : doSqlShardingRoute());
        } catch (final Exception ex) {
            log.error("ExecuteBackendHandler", ex);
            return new CommandResponsePackets(new ErrPacket(1, 0, "", "" + ex.getMessage()));
            return new CommandResponsePackets(new ErrPacket(1, new SQLException(ex)));
        }
    }
    
@@ -151,9 +151,9 @@ public abstract class JDBCBackendHandler implements BackendHandler {
    
    protected abstract SQLRouteResult doSqlShardingRoute();
    
    protected abstract Statement prepareResource(String dataSourceName, String unitSql, SQLStatement sqlStatement) throws SQLException;
    protected abstract Statement prepareResource(String dataSourceName, String unitSQL, SQLStatement sqlStatement) throws SQLException;
    
    protected abstract Callable<CommandResponsePackets> newSubmitTask(Statement statement, SQLStatement sqlStatement, String unitSql);
    protected abstract Callable<CommandResponsePackets> newSubmitTask(Statement statement, SQLStatement sqlStatement, String unitSQL);
    
    private List<CommandResponsePackets> buildCommandResponsePackets(final List<Future<CommandResponsePackets>> futureList) {
        List<CommandResponsePackets> result = new ArrayList<>();
+12 −12
Original line number Diff line number Diff line
@@ -55,24 +55,24 @@ import java.util.concurrent.CopyOnWriteArrayList;
 */
public final class JDBCStatementBackendHandler extends JDBCBackendHandler {
    
    private final RuleRegistry ruleRegistry;
    
    private final List<PreparedStatementParameter> preparedStatementParameters;
    
    @Getter
    private final List<ColumnType> columnTypes;
    
    public JDBCStatementBackendHandler(final List<PreparedStatementParameter> preparedStatementParameters, final int statementId,
                                       final DatabaseType databaseType, final boolean showSQL) {
        super(PreparedStatementRegistry.getInstance().getSQL(statementId), databaseType, showSQL);
        super.setJdbcResource(ProxyJDBCResourceFactory.newPrepareResource());
    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();
        this.preparedStatementParameters = preparedStatementParameters;
        columnTypes = new CopyOnWriteArrayList<>();
    }
    
    @Override
    protected SQLRouteResult doSqlShardingRoute() {
        PreparedStatementRoutingEngine routingEngine = new PreparedStatementRoutingEngine(getSql(),
                RuleRegistry.getInstance().getShardingRule(), RuleRegistry.getInstance().getShardingMetaData(),
                getDatabaseType(), isShowSQL(), RuleRegistry.getInstance().getShardingDataSourceMetaData());
        PreparedStatementRoutingEngine routingEngine = new PreparedStatementRoutingEngine(
                getSql(), ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), getDatabaseType(), isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
        return routingEngine.route(getComStmtExecuteParameters());
    }
    
@@ -85,15 +85,15 @@ public final class JDBCStatementBackendHandler extends JDBCBackendHandler {
    }
    
    @Override
    protected Callable<CommandResponsePackets> newSubmitTask(final Statement statement, final SQLStatement sqlStatement, final String unitSql) {
    protected Callable<CommandResponsePackets> newSubmitTask(final Statement statement, final SQLStatement sqlStatement, final String unitSQL) {
        return new JDBCStatementExecuteWorker(this, sqlStatement, (PreparedStatement) statement);
    }
    
    @Override
    protected PreparedStatement prepareResource(final String dataSourceName, final String unitSql, final SQLStatement sqlStatement) throws SQLException {
        DataSource dataSource = RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName);
    protected PreparedStatement prepareResource(final String dataSourceName, final String unitSQL, final SQLStatement sqlStatement) throws SQLException {
        DataSource dataSource = ruleRegistry.getDataSourceMap().get(dataSourceName);
        Connection connection = getConnection(dataSource);
        PreparedStatement result = sqlStatement instanceof InsertStatement ? connection.prepareStatement(unitSql, Statement.RETURN_GENERATED_KEYS) : connection.prepareStatement(unitSql);
        PreparedStatement result = sqlStatement instanceof InsertStatement ? connection.prepareStatement(unitSQL, Statement.RETURN_GENERATED_KEYS) : connection.prepareStatement(unitSQL);
        for (int i = 0; i < preparedStatementParameters.size(); i++) {
            result.setObject(i + 1, preparedStatementParameters.get(i).getValue());
        }
@@ -106,7 +106,7 @@ public final class JDBCStatementBackendHandler extends JDBCBackendHandler {
    @Override
    protected QueryResult newQueryResult(final CommandResponsePackets packet, final int index) {
        MySQLPacketStatementExecuteQueryResult result = new MySQLPacketStatementExecuteQueryResult(packet, columnTypes);
        if (ProxyMode.MEMORY_STRICTLY == RuleRegistry.getInstance().getProxyMode()) {
        if (ProxyMode.MEMORY_STRICTLY == ruleRegistry.getProxyMode()) {
            result.setResultSet(getJdbcResource().getResultSets().get(index));
        } else {
            result.setResultList(getResultLists().get(index));
+11 −9
Original line number Diff line number Diff line
@@ -48,21 +48,23 @@ import java.util.concurrent.Callable;
 */
public final class JDBCTextBackendHandler extends JDBCBackendHandler {
   
    private final RuleRegistry ruleRegistry;
    
    public JDBCTextBackendHandler(final String sql, final DatabaseType databaseType, final boolean showSQL) {
        super(sql, databaseType, showSQL);
        setJdbcResource(ProxyJDBCResourceFactory.newResource());
        super(sql, databaseType, showSQL, ProxyJDBCResourceFactory.newResource());
        ruleRegistry = RuleRegistry.getInstance();
    }
    
    @Override
    protected SQLRouteResult doSqlShardingRoute() {
        StatementRoutingEngine routingEngine = new StatementRoutingEngine(RuleRegistry.getInstance().getShardingRule(),
                RuleRegistry.getInstance().getShardingMetaData(), getDatabaseType(), isShowSQL(), RuleRegistry.getInstance().getShardingDataSourceMetaData());
        StatementRoutingEngine routingEngine = new StatementRoutingEngine(
                ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), getDatabaseType(), isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
        return routingEngine.route(getSql());
    }
    
    @Override
    protected Statement prepareResource(final String dataSourceName, final String unitSql, final SQLStatement sqlStatement) throws SQLException {
        DataSource dataSource = RuleRegistry.getInstance().getDataSourceMap().get(dataSourceName);
    protected Statement prepareResource(final String dataSourceName, final String unitSQL, final SQLStatement sqlStatement) throws SQLException {
        DataSource dataSource = ruleRegistry.getDataSourceMap().get(dataSourceName);
        Connection connection = getConnection(dataSource);
        Statement result = connection.createStatement();
        ProxyJDBCResource proxyJDBCResource = (ProxyJDBCResource) getJdbcResource();
@@ -72,14 +74,14 @@ public final class JDBCTextBackendHandler extends JDBCBackendHandler {
    }
    
    @Override
    protected Callable<CommandResponsePackets> newSubmitTask(final Statement statement, final SQLStatement sqlStatement, final String unitSql) {
        return new JDBCTextExecuteWorker(this, sqlStatement, statement, unitSql);
    protected Callable<CommandResponsePackets> newSubmitTask(final Statement statement, final SQLStatement sqlStatement, final String unitSQL) {
        return new JDBCTextExecuteWorker(this, sqlStatement, statement, unitSQL);
    }
    
    @Override
    protected QueryResult newQueryResult(final CommandResponsePackets packet, final int index) {
        MySQLPacketQueryResult result = new MySQLPacketQueryResult(packet);
        if (ProxyMode.MEMORY_STRICTLY == RuleRegistry.getInstance().getProxyMode()) {
        if (ProxyMode.MEMORY_STRICTLY == ruleRegistry.getProxyMode()) {
            result.setResultSet(getJdbcResource().getResultSets().get(index));
        } else {
            result.setResultList(getResultLists().get(index));
+1 −1
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ public final class RuleRegistry {
     *
     * @param config yaml proxy configuration
     */
    public void init(final OrchestrationProxyConfiguration config) {
    public synchronized void init(final OrchestrationProxyConfiguration config) {
        Properties properties = null == config.getShardingRule() ? new Properties() : config.getShardingRule().getProps();
        ShardingProperties shardingProperties = new ShardingProperties(null == properties ? new Properties() : properties);
        showSQL = shardingProperties.getValue(ShardingPropertiesConstant.SQL_SHOW);
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ public final class ComQueryPacket extends CommandPacket implements CommandPacket
            }
        } catch (final Exception ex) {
            log.error("doTransactionIntercept Exception", ex);
            return new CommandResponsePackets(new ErrPacket(1, 0, "", "" + ex.getMessage()));
            return new CommandResponsePackets(new ErrPacket(1, new SQLException(ex)));
        }
        return backendHandler.execute();
    }