From 12700b2aa65d844f661d95c3215edb90974e7353 Mon Sep 17 00:00:00 2001 From: terrymanu Date: Tue, 24 Jul 2018 00:16:39 +0800 Subject: [PATCH] refactor JDBCBackendHandler --- .../common/jdbc/JDBCBackendHandler.java | 19 +-------- .../JDBCStatementBackendHandler.java | 31 +------------- .../jdbc/text/JDBCTextBackendHandler.java | 19 +-------- .../jdbc/wrapper/JDBCExecutorWrapper.java | 12 ++++++ .../PreparedStatementExecutorWrapper.java | 40 +++++++++++++++++++ .../wrapper/StatementExecutorWrapper.java | 34 ++++++++++++++++ .../execute/ComStmtExecutePacket.java | 2 +- .../text/fieldlist/ComFieldListPacket.java | 2 +- .../command/text/query/ComQueryPacket.java | 2 +- 9 files changed, 93 insertions(+), 68 deletions(-) diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/JDBCBackendHandler.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/JDBCBackendHandler.java index e4f9546ad3..2c6f7a974a 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/JDBCBackendHandler.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/JDBCBackendHandler.java @@ -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.>emptyList()))); - } - return result; - } - - protected abstract SQLRouteResult doShardingRoute(); - private Optional findSQLException(final Exception exception) { if (null == exception.getCause()) { return Optional.absent(); diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/statement/JDBCStatementBackendHandler.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/statement/JDBCStatementBackendHandler.java index 9bd559828d..47eba3889e 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/statement/JDBCStatementBackendHandler.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/statement/JDBCStatementBackendHandler.java @@ -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 preparedStatementParameters; - - private final DatabaseType databaseType; - - private final RuleRegistry ruleRegistry; - - public JDBCStatementBackendHandler(final List preparedStatementParameters, final int statementId, final DatabaseType databaseType) { + public JDBCStatementBackendHandler(final List 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 getComStmtExecuteParameters() { - List result = new ArrayList<>(32); - for (PreparedStatementParameter each : preparedStatementParameters) { - result.add(each.getValue()); - } - return result; } @Override diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/text/JDBCTextBackendHandler.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/text/JDBCTextBackendHandler.java index 9fae396369..ac9b28a3f3 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/text/JDBCTextBackendHandler.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/text/JDBCTextBackendHandler.java @@ -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 diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/JDBCExecutorWrapper.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/JDBCExecutorWrapper.java index 2b9cd02055..e8230d164d 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/JDBCExecutorWrapper.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/JDBCExecutorWrapper.java @@ -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. * diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/PreparedStatementExecutorWrapper.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/PreparedStatementExecutorWrapper.java index 2d057b1875..d304a6571d 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/PreparedStatementExecutorWrapper.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/PreparedStatementExecutorWrapper.java @@ -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 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.>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() { + + @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); diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/StatementExecutorWrapper.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/StatementExecutorWrapper.java index 3d6239c09e..f4433e56b9 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/StatementExecutorWrapper.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/backend/common/jdbc/wrapper/StatementExecutorWrapper.java @@ -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.>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(); diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java index 24ea28a41d..b29ec0bdfd 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/statement/execute/ComStmtExecutePacket.java @@ -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) { diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/fieldlist/ComFieldListPacket.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/fieldlist/ComFieldListPacket.java index 78588170c4..ec90613cb6 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/fieldlist/ComFieldListPacket.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/fieldlist/ComFieldListPacket.java @@ -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 diff --git a/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/query/ComQueryPacket.java b/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/query/ComQueryPacket.java index eaa406fddf..78d7e84294 100644 --- a/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/query/ComQueryPacket.java +++ b/sharding-proxy/src/main/java/io/shardingsphere/proxy/transport/mysql/packet/command/text/query/ComQueryPacket.java @@ -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); } /** -- GitLab