提交 12700b2a 编写于 作者: T terrymanu

refactor JDBCBackendHandler

上级 6790723a
......@@ -18,18 +18,15 @@
package io.shardingsphere.proxy.backend.common.jdbc;
import com.google.common.base.Optional;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.constant.SQLType;
import io.shardingsphere.core.constant.TransactionType;
import io.shardingsphere.core.exception.ShardingException;
import io.shardingsphere.core.merger.MergeEngineFactory;
import io.shardingsphere.core.merger.MergedResult;
import io.shardingsphere.core.parsing.SQLJudgeEngine;
import io.shardingsphere.core.parsing.parser.sql.SQLStatement;
import io.shardingsphere.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingsphere.core.routing.SQLExecutionUnit;
import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.core.routing.SQLUnit;
import io.shardingsphere.core.routing.router.masterslave.MasterSlaveRouter;
import io.shardingsphere.proxy.backend.common.BackendHandler;
import io.shardingsphere.proxy.backend.common.jdbc.execute.JDBCExecuteEngine;
import io.shardingsphere.proxy.backend.common.jdbc.execute.response.ExecuteQueryResponse;
......@@ -52,7 +49,6 @@ import javax.transaction.Status;
import javax.transaction.SystemException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
......@@ -94,7 +90,7 @@ public abstract class JDBCBackendHandler implements BackendHandler {
@Override
public final CommandResponsePackets execute() {
try {
return execute(ruleRegistry.isMasterSlaveOnly() ? doMasterSlaveRoute() : doShardingRoute());
return execute(executeEngine.getJdbcExecutorWrapper().route(sql, DatabaseType.MySQL));
} catch (final SQLException ex) {
return new CommandResponsePackets(new ErrPacket(1, ex));
} catch (final SystemException | ShardingException ex) {
......@@ -138,17 +134,6 @@ public abstract class JDBCBackendHandler implements BackendHandler {
return result;
}
private SQLRouteResult doMasterSlaveRoute() {
SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge();
SQLRouteResult result = new SQLRouteResult(sqlStatement);
for (String each : new MasterSlaveRouter(ruleRegistry.getMasterSlaveRule(), ruleRegistry.isShowSQL()).route(sql)) {
result.getExecutionUnits().add(new SQLExecutionUnit(each, new SQLUnit(sql, Collections.<List<Object>>emptyList())));
}
return result;
}
protected abstract SQLRouteResult doShardingRoute();
private Optional<SQLException> findSQLException(final Exception exception) {
if (null == exception.getCause()) {
return Optional.absent();
......
......@@ -17,19 +17,14 @@
package io.shardingsphere.proxy.backend.common.jdbc.statement;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.routing.PreparedStatementRoutingEngine;
import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.proxy.backend.common.jdbc.JDBCBackendHandler;
import io.shardingsphere.proxy.backend.common.jdbc.execute.JDBCExecuteEngineFactory;
import io.shardingsphere.proxy.config.RuleRegistry;
import io.shardingsphere.proxy.transport.common.packet.DatabasePacket;
import io.shardingsphere.proxy.transport.mysql.constant.ColumnType;
import io.shardingsphere.proxy.transport.mysql.packet.command.statement.PreparedStatementRegistry;
import io.shardingsphere.proxy.transport.mysql.packet.command.statement.execute.BinaryResultSetRowPacket;
import io.shardingsphere.proxy.transport.mysql.packet.command.statement.execute.PreparedStatementParameter;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -40,32 +35,8 @@ import java.util.List;
*/
public final class JDBCStatementBackendHandler extends JDBCBackendHandler {
private final List<PreparedStatementParameter> preparedStatementParameters;
private final DatabaseType databaseType;
private final RuleRegistry ruleRegistry;
public JDBCStatementBackendHandler(final List<PreparedStatementParameter> preparedStatementParameters, final int statementId, final DatabaseType databaseType) {
public JDBCStatementBackendHandler(final List<PreparedStatementParameter> preparedStatementParameters, final int statementId) {
super(PreparedStatementRegistry.getInstance().getSQL(statementId), JDBCExecuteEngineFactory.createStatementProtocolInstance(preparedStatementParameters));
this.preparedStatementParameters = preparedStatementParameters;
this.databaseType = databaseType;
ruleRegistry = RuleRegistry.getInstance();
}
@Override
protected SQLRouteResult doShardingRoute() {
PreparedStatementRoutingEngine routingEngine = new PreparedStatementRoutingEngine(
getSql(), ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), databaseType, ruleRegistry.isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
return routingEngine.route(getComStmtExecuteParameters());
}
private List<Object> getComStmtExecuteParameters() {
List<Object> result = new ArrayList<>(32);
for (PreparedStatementParameter each : preparedStatementParameters) {
result.add(each.getValue());
}
return result;
}
@Override
......
......@@ -17,12 +17,8 @@
package io.shardingsphere.proxy.backend.common.jdbc.text;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.core.routing.StatementRoutingEngine;
import io.shardingsphere.proxy.backend.common.jdbc.JDBCBackendHandler;
import io.shardingsphere.proxy.backend.common.jdbc.execute.JDBCExecuteEngineFactory;
import io.shardingsphere.proxy.config.RuleRegistry;
import io.shardingsphere.proxy.transport.common.packet.DatabasePacket;
import io.shardingsphere.proxy.transport.mysql.constant.ColumnType;
import io.shardingsphere.proxy.transport.mysql.packet.command.text.query.TextResultSetRowPacket;
......@@ -38,21 +34,8 @@ import java.util.List;
*/
public final class JDBCTextBackendHandler extends JDBCBackendHandler {
private final DatabaseType databaseType;
private final RuleRegistry ruleRegistry;
public JDBCTextBackendHandler(final String sql, final DatabaseType databaseType) {
public JDBCTextBackendHandler(final String sql) {
super(sql, JDBCExecuteEngineFactory.createTextProtocolInstance());
this.databaseType = databaseType;
ruleRegistry = RuleRegistry.getInstance();
}
@Override
protected SQLRouteResult doShardingRoute() {
StatementRoutingEngine routingEngine = new StatementRoutingEngine(
ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), databaseType, ruleRegistry.isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
return routingEngine.route(getSql());
}
@Override
......
......@@ -17,6 +17,9 @@
package io.shardingsphere.proxy.backend.common.jdbc.wrapper;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.routing.SQLRouteResult;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
......@@ -28,6 +31,15 @@ import java.sql.Statement;
*/
public interface JDBCExecutorWrapper {
/**
* Route SQL.
*
* @param sql SQL to be routed
* @param databaseType database type
* @return SQL route result
*/
SQLRouteResult route(String sql, DatabaseType databaseType);
/**
* Create statement.
*
......
......@@ -17,6 +17,17 @@
package io.shardingsphere.proxy.backend.common.jdbc.wrapper;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.parsing.SQLJudgeEngine;
import io.shardingsphere.core.parsing.parser.sql.SQLStatement;
import io.shardingsphere.core.routing.PreparedStatementRoutingEngine;
import io.shardingsphere.core.routing.SQLExecutionUnit;
import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.core.routing.SQLUnit;
import io.shardingsphere.core.routing.router.masterslave.MasterSlaveRouter;
import io.shardingsphere.proxy.config.RuleRegistry;
import io.shardingsphere.proxy.transport.mysql.packet.command.statement.execute.PreparedStatementParameter;
import lombok.RequiredArgsConstructor;
......@@ -24,6 +35,7 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.List;
/**
......@@ -34,8 +46,36 @@ import java.util.List;
@RequiredArgsConstructor
public final class PreparedStatementExecutorWrapper implements JDBCExecutorWrapper {
private final RuleRegistry ruleRegistry = RuleRegistry.getInstance();
private final List<PreparedStatementParameter> preparedStatementParameters;
@Override
public SQLRouteResult route(final String sql, final DatabaseType databaseType) {
return ruleRegistry.isMasterSlaveOnly() ? doMasterSlaveRoute(sql) : doShardingRoute(sql, databaseType);
}
private SQLRouteResult doMasterSlaveRoute(final String sql) {
SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge();
SQLRouteResult result = new SQLRouteResult(sqlStatement);
for (String each : new MasterSlaveRouter(ruleRegistry.getMasterSlaveRule(), ruleRegistry.isShowSQL()).route(sql)) {
result.getExecutionUnits().add(new SQLExecutionUnit(each, new SQLUnit(sql, Collections.<List<Object>>emptyList())));
}
return result;
}
private SQLRouteResult doShardingRoute(final String sql, final DatabaseType databaseType) {
PreparedStatementRoutingEngine routingEngine = new PreparedStatementRoutingEngine(
sql, ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), databaseType, ruleRegistry.isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
return routingEngine.route(Lists.transform(preparedStatementParameters, new Function<PreparedStatementParameter, Object>() {
@Override
public Object apply(final PreparedStatementParameter input) {
return input.getValue();
}
}));
}
@Override
public Statement createStatement(final Connection connection, final String sql, final boolean isReturnGeneratedKeys) throws SQLException {
PreparedStatement result = isReturnGeneratedKeys ? connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) : connection.prepareStatement(sql);
......
......@@ -17,9 +17,21 @@
package io.shardingsphere.proxy.backend.common.jdbc.wrapper;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.parsing.SQLJudgeEngine;
import io.shardingsphere.core.parsing.parser.sql.SQLStatement;
import io.shardingsphere.core.routing.SQLExecutionUnit;
import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.core.routing.SQLUnit;
import io.shardingsphere.core.routing.StatementRoutingEngine;
import io.shardingsphere.core.routing.router.masterslave.MasterSlaveRouter;
import io.shardingsphere.proxy.config.RuleRegistry;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.List;
/**
* Executor wrapper for statement.
......@@ -28,6 +40,28 @@ import java.sql.Statement;
*/
public final class StatementExecutorWrapper implements JDBCExecutorWrapper {
private final RuleRegistry ruleRegistry = RuleRegistry.getInstance();
@Override
public SQLRouteResult route(final String sql, final DatabaseType databaseType) {
return ruleRegistry.isMasterSlaveOnly() ? doMasterSlaveRoute(sql) : doShardingRoute(sql, databaseType);
}
private SQLRouteResult doMasterSlaveRoute(final String sql) {
SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge();
SQLRouteResult result = new SQLRouteResult(sqlStatement);
for (String each : new MasterSlaveRouter(ruleRegistry.getMasterSlaveRule(), ruleRegistry.isShowSQL()).route(sql)) {
result.getExecutionUnits().add(new SQLExecutionUnit(each, new SQLUnit(sql, Collections.<List<Object>>emptyList())));
}
return result;
}
private SQLRouteResult doShardingRoute(final String sql, final DatabaseType databaseType) {
StatementRoutingEngine routingEngine = new StatementRoutingEngine(
ruleRegistry.getShardingRule(), ruleRegistry.getShardingMetaData(), databaseType, ruleRegistry.isShowSQL(), ruleRegistry.getShardingDataSourceMetaData());
return routingEngine.route(sql);
}
@Override
public Statement createStatement(final Connection connection, final String sql, final boolean isReturnGeneratedKeys) throws SQLException {
return connection.createStatement();
......
......@@ -82,7 +82,7 @@ public final class ComStmtExecutePacket extends CommandPacket {
}
newParametersBoundFlag = NewParametersBoundFlag.valueOf(payload.readInt1());
setParameterList(payload, numParameters, newParametersBoundFlag);
statementExecuteBackendHandler = new JDBCStatementBackendHandler(preparedStatementParameters, statementId, DatabaseType.MySQL);
statementExecuteBackendHandler = new JDBCStatementBackendHandler(preparedStatementParameters, statementId);
}
private void setParameterList(final MySQLPacketPayload payload, final int numParameters, final NewParametersBoundFlag newParametersBoundFlag) {
......
......@@ -95,7 +95,7 @@ public final class ComFieldListPacket extends CommandPacket implements CommandPa
}
private BackendHandler getBackendHandler(final String sql) {
return RuleRegistry.getInstance().isProxyBackendUseNio() ? new SQLPacketsBackendHandler(this, DatabaseType.MySQL) : new JDBCTextBackendHandler(sql, DatabaseType.MySQL);
return RuleRegistry.getInstance().isProxyBackendUseNio() ? new SQLPacketsBackendHandler(this, DatabaseType.MySQL) : new JDBCTextBackendHandler(sql);
}
@Override
......
......@@ -94,7 +94,7 @@ public final class ComQueryPacket extends CommandPacket implements CommandPacket
}
private BackendHandler getBackendHandler(final String sql) {
return RuleRegistry.getInstance().isProxyBackendUseNio() ? new SQLPacketsBackendHandler(this, DatabaseType.MySQL) : new JDBCTextBackendHandler(sql, DatabaseType.MySQL);
return RuleRegistry.getInstance().isProxyBackendUseNio() ? new SQLPacketsBackendHandler(this, DatabaseType.MySQL) : new JDBCTextBackendHandler(sql);
}
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册