diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/InsertValuesClauseParser.java b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/InsertValuesClauseParser.java index 733b0a603f29e90236a4851455b68424b472601e..2db4953ce19de2053c8a94bba697978caa6e8834 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/InsertValuesClauseParser.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/parsing/parser/clause/InsertValuesClauseParser.java @@ -49,6 +49,7 @@ import java.util.List; * * @author zhangliang * @author maxiaoguang + * @author panjuan */ public class InsertValuesClauseParser implements SQLClauseParser { diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/yaml/sharding/YamlShardingConfigurationForProxy.java b/sharding-core/src/main/java/io/shardingjdbc/core/yaml/proxy/YamlProxyConfiguration.java similarity index 58% rename from sharding-core/src/main/java/io/shardingjdbc/core/yaml/sharding/YamlShardingConfigurationForProxy.java rename to sharding-core/src/main/java/io/shardingjdbc/core/yaml/proxy/YamlProxyConfiguration.java index e60b760e9a5b668b67892efb3e2289b8a1e0eaa6..6c9f4fdef1fc6ae68ff3aae95e20336c86b273b3 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/yaml/sharding/YamlShardingConfigurationForProxy.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/yaml/proxy/YamlProxyConfiguration.java @@ -15,9 +15,14 @@ *

*/ -package io.shardingjdbc.core.yaml.sharding; +package io.shardingjdbc.core.yaml.proxy; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; +import io.shardingjdbc.core.rule.MasterSlaveRule; import io.shardingjdbc.core.rule.ShardingRule; +import io.shardingjdbc.core.yaml.masterslave.YamlMasterSlaveRuleConfiguration; +import io.shardingjdbc.core.yaml.sharding.DataSourceParameter; +import io.shardingjdbc.core.yaml.sharding.YamlShardingRuleConfiguration; import lombok.Getter; import lombok.Setter; import org.yaml.snakeyaml.Yaml; @@ -29,6 +34,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -37,14 +43,17 @@ import java.util.Map; * Yaml sharding configuration for proxy. * * @author zhangyonglun + * @author panjuan */ @Getter @Setter -public class YamlShardingConfigurationForProxy { +public class YamlProxyConfiguration { private Map dataSources = new HashMap<>(); - private YamlShardingRuleConfiguration shardingRule; + private YamlMasterSlaveRuleConfiguration masterSlaveRule = new YamlMasterSlaveRuleConfiguration(); + + private YamlShardingRuleConfiguration shardingRule = new YamlShardingRuleConfiguration(); /** * Unmarshal yaml sharding configuration from yaml file. @@ -52,13 +61,14 @@ public class YamlShardingConfigurationForProxy { * @param yamlFile yaml file * @return yaml sharding configuration * @throws IOException IO Exception + * */ - public static YamlShardingConfigurationForProxy unmarshal(final File yamlFile) throws IOException { + public static YamlProxyConfiguration unmarshal(final File yamlFile) throws IOException { try ( FileInputStream fileInputStream = new FileInputStream(yamlFile); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8") ) { - return new Yaml(new Constructor(YamlShardingConfigurationForProxy.class)).loadAs(inputStreamReader, YamlShardingConfigurationForProxy.class); + return new Yaml(new Constructor(YamlProxyConfiguration.class)).loadAs(inputStreamReader, YamlProxyConfiguration.class); } } @@ -69,9 +79,9 @@ public class YamlShardingConfigurationForProxy { * @return yaml sharding configuration * @throws IOException IO Exception */ - public static YamlShardingConfigurationForProxy unmarshal(final byte[] yamlBytes) throws IOException { + public static YamlProxyConfiguration unmarshal(final byte[] yamlBytes) throws IOException { try (InputStream inputStream = new ByteArrayInputStream(yamlBytes)) { - return new Yaml(new Constructor(YamlShardingConfigurationForProxy.class)).loadAs(inputStream, YamlShardingConfigurationForProxy.class); + return new Yaml(new Constructor(YamlProxyConfiguration.class)).loadAs(inputStream, YamlProxyConfiguration.class); } } @@ -81,7 +91,17 @@ public class YamlShardingConfigurationForProxy { * @param dataSourceNames data source names * @return sharding rule from yaml */ - public ShardingRule getShardingRule(final Collection dataSourceNames) { + public ShardingRule obtainShardingRule(final Collection dataSourceNames) { return new ShardingRule(shardingRule.getShardingRuleConfiguration(), dataSourceNames.isEmpty() ? dataSources.keySet() : dataSourceNames); } + + /** + * Get master slave rule from yaml. + * + * @return master slave rule. + */ + public MasterSlaveRule obtainMasterSlaveRule() { + return null == masterSlaveRule.getMasterDataSourceName() ? new MasterSlaveRule(new MasterSlaveRuleConfiguration("", "", Arrays.asList(""), null)) + : new MasterSlaveRule(masterSlaveRule.getMasterSlaveRuleConfiguration()); + } } diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java index d62cfeae2251e1a7e161d19ad46fbc04997e2001..5ee1a73343f79e1b4e01183f5e535b8258643d9e 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/SQLExecuteBackendHandler.java @@ -22,20 +22,23 @@ import io.shardingjdbc.core.constant.SQLType; import io.shardingjdbc.core.merger.MergeEngineFactory; import io.shardingjdbc.core.merger.MergedResult; import io.shardingjdbc.core.merger.QueryResult; +import io.shardingjdbc.core.parsing.SQLJudgeEngine; import io.shardingjdbc.core.parsing.parser.sql.SQLStatement; import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement; import io.shardingjdbc.core.routing.SQLExecutionUnit; import io.shardingjdbc.core.routing.SQLRouteResult; import io.shardingjdbc.core.routing.StatementRoutingEngine; +import io.shardingjdbc.core.routing.router.masterslave.MasterSlaveRouter; +import io.shardingjdbc.core.routing.router.masterslave.MasterVisitedManager; import io.shardingjdbc.proxy.backend.mysql.MySQLPacketQueryResult; import io.shardingjdbc.proxy.config.ShardingRuleRegistry; +import io.shardingjdbc.proxy.transport.common.packet.DatabaseProtocolPacket; import io.shardingjdbc.proxy.transport.mysql.constant.ColumnType; import io.shardingjdbc.proxy.transport.mysql.constant.StatusFlag; -import io.shardingjdbc.proxy.transport.common.packet.DatabaseProtocolPacket; import io.shardingjdbc.proxy.transport.mysql.packet.command.CommandResponsePackets; +import io.shardingjdbc.proxy.transport.mysql.packet.command.text.query.ColumnDefinition41Packet; import io.shardingjdbc.proxy.transport.mysql.packet.command.text.query.FieldCountPacket; import io.shardingjdbc.proxy.transport.mysql.packet.command.text.query.TextResultSetRowPacket; -import io.shardingjdbc.proxy.transport.mysql.packet.command.text.query.ColumnDefinition41Packet; import io.shardingjdbc.proxy.transport.mysql.packet.generic.EofPacket; import io.shardingjdbc.proxy.transport.mysql.packet.generic.ErrPacket; import io.shardingjdbc.proxy.transport.mysql.packet.generic.OKPacket; @@ -62,9 +65,7 @@ public final class SQLExecuteBackendHandler implements BackendHandler { private static final Integer FETCH_ONE_ROW_A_TIME = Integer.MIN_VALUE; private final String sql; - - private final StatementRoutingEngine routingEngine; - + private List connections; private List resultSets; @@ -79,17 +80,36 @@ public final class SQLExecuteBackendHandler implements BackendHandler { private boolean hasMoreResultValueFlag; + private final DatabaseType databaseType; + + private final boolean showSQL; + public SQLExecuteBackendHandler(final String sql, final DatabaseType databaseType, final boolean showSQL) { this.sql = sql; - routingEngine = new StatementRoutingEngine(ShardingRuleRegistry.getInstance().getShardingRule(), ShardingRuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); connections = new ArrayList<>(1024); resultSets = new ArrayList<>(1024); isMerged = false; hasMoreResultValueFlag = true; + this.databaseType = databaseType; + this.showSQL = showSQL; } @Override public CommandResponsePackets execute() { + return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeForMasterSlave() : executeForSharding(); + } + + private CommandResponsePackets executeForMasterSlave() { + MasterSlaveRouter masterSlaveRouter = new MasterSlaveRouter(ShardingRuleRegistry.getInstance().getMasterSlaveRule()); + SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge(); + String dataSourceName = masterSlaveRouter.route(sqlStatement.getType()).iterator().next(); + List result = new LinkedList<>(); + result.add(execute(sqlStatement, dataSourceName, sql)); + return merge(sqlStatement, result); + } + + private CommandResponsePackets executeForSharding() { + StatementRoutingEngine routingEngine = new StatementRoutingEngine(ShardingRuleRegistry.getInstance().getShardingRule(), ShardingRuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); SQLRouteResult routeResult = routingEngine.route(sql); if (routeResult.getExecutionUnits().isEmpty()) { return new CommandResponsePackets(new OKPacket(1, 0, 0, StatusFlag.SERVER_STATUS_AUTOCOMMIT.getValue(), 0, "")); @@ -97,21 +117,22 @@ public final class SQLExecuteBackendHandler implements BackendHandler { List result = new LinkedList<>(); for (SQLExecutionUnit each : routeResult.getExecutionUnits()) { // TODO multiple threads - result.add(execute(routeResult.getSqlStatement(), each)); + result.add(execute(routeResult.getSqlStatement(), each.getDataSource(), each.getSqlUnit().getSql())); } return merge(routeResult.getSqlStatement(), result); } - private CommandResponsePackets execute(final SQLStatement sqlStatement, final SQLExecutionUnit sqlExecutionUnit) { + private CommandResponsePackets execute(final SQLStatement sqlStatement, final String dataSourceName, final String sql) { switch (sqlStatement.getType()) { case DQL: case DAL: - return executeQuery(ShardingRuleRegistry.getInstance().getDataSourceMap().get(sqlExecutionUnit.getDataSource()), sqlExecutionUnit.getSqlUnit().getSql()); + return executeQuery(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); case DML: case DDL: - return executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(sqlExecutionUnit.getDataSource()), sqlExecutionUnit.getSqlUnit().getSql(), sqlStatement); + return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql) + : executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql, sqlStatement); default: - return executeCommon(ShardingRuleRegistry.getInstance().getDataSourceMap().get(sqlExecutionUnit.getDataSource()), sqlExecutionUnit.getSqlUnit().getSql()); + return executeCommon(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); } } @@ -143,6 +164,25 @@ public final class SQLExecuteBackendHandler implements BackendHandler { return new CommandResponsePackets(new OKPacket(1, affectedRows, lastInsertId, StatusFlag.SERVER_STATUS_AUTOCOMMIT.getValue(), 0, "")); } catch (final SQLException ex) { return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); + } finally { + MasterVisitedManager.clear(); + } + } + + private CommandResponsePackets executeUpdate(final DataSource dataSource, final String sql) { + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + int affectedRows = statement.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); + ResultSet resultSet = statement.getGeneratedKeys(); + long lastInsertId = 0; + while (resultSet.next()) { + lastInsertId = resultSet.getLong(1); + } + return new CommandResponsePackets(new OKPacket(1, affectedRows, lastInsertId, StatusFlag.SERVER_STATUS_AUTOCOMMIT.getValue(), 0, "")); + } catch (final SQLException ex) { + return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); + } finally { + MasterVisitedManager.clear(); } } @@ -158,6 +198,8 @@ public final class SQLExecuteBackendHandler implements BackendHandler { } } catch (final SQLException ex) { return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); + } finally { + MasterVisitedManager.clear(); } } @@ -326,6 +368,7 @@ public final class SQLExecuteBackendHandler implements BackendHandler { if (null != each) { try { each.close(); + MasterVisitedManager.clear(); } catch (final SQLException ignore) { } } diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java index 0f8067cfce6bdb38c18dd0aa65f0f523f71a504d..ad97bf5c3810afd78b99ad916ef30a9112af3c78 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/backend/common/StatementExecuteBackendHandler.java @@ -22,17 +22,21 @@ import io.shardingjdbc.core.constant.SQLType; import io.shardingjdbc.core.merger.MergeEngineFactory; import io.shardingjdbc.core.merger.MergedResult; import io.shardingjdbc.core.merger.QueryResult; +import io.shardingjdbc.core.parsing.SQLJudgeEngine; import io.shardingjdbc.core.parsing.parser.sql.SQLStatement; import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement; import io.shardingjdbc.core.routing.PreparedStatementRoutingEngine; import io.shardingjdbc.core.routing.SQLExecutionUnit; import io.shardingjdbc.core.routing.SQLRouteResult; +import io.shardingjdbc.core.routing.router.masterslave.MasterSlaveRouter; +import io.shardingjdbc.core.routing.router.masterslave.MasterVisitedManager; import io.shardingjdbc.proxy.backend.mysql.MySQLPacketStatementExecuteQueryResult; import io.shardingjdbc.proxy.config.ShardingRuleRegistry; import io.shardingjdbc.proxy.transport.common.packet.DatabaseProtocolPacket; import io.shardingjdbc.proxy.transport.mysql.constant.ColumnType; import io.shardingjdbc.proxy.transport.mysql.constant.StatusFlag; import io.shardingjdbc.proxy.transport.mysql.packet.command.CommandResponsePackets; +import io.shardingjdbc.proxy.transport.mysql.packet.command.statement.PreparedStatementRegistry; import io.shardingjdbc.proxy.transport.mysql.packet.command.statement.execute.BinaryResultSetRowPacket; import io.shardingjdbc.proxy.transport.mysql.packet.command.statement.execute.PreparedStatementParameter; import io.shardingjdbc.proxy.transport.mysql.packet.command.text.query.ColumnDefinition41Packet; @@ -40,7 +44,6 @@ import io.shardingjdbc.proxy.transport.mysql.packet.command.text.query.FieldCoun import io.shardingjdbc.proxy.transport.mysql.packet.generic.EofPacket; import io.shardingjdbc.proxy.transport.mysql.packet.generic.ErrPacket; import io.shardingjdbc.proxy.transport.mysql.packet.generic.OKPacket; -import io.shardingjdbc.proxy.transport.mysql.packet.command.statement.PreparedStatementRegistry; import javax.sql.DataSource; import java.sql.Connection; @@ -65,8 +68,6 @@ public final class StatementExecuteBackendHandler implements BackendHandler { private final List preparedStatementParameters; - private final PreparedStatementRoutingEngine routingEngine; - private List connections; private List resultSets; @@ -83,19 +84,41 @@ public final class StatementExecuteBackendHandler implements BackendHandler { private boolean hasMoreResultValueFlag; + private final DatabaseType databaseType; + + private final boolean showSQL; + + private final String sql; + public StatementExecuteBackendHandler(final List preparedStatementParameters, final int statementId, final DatabaseType databaseType, final boolean showSQL) { this.preparedStatementParameters = preparedStatementParameters; - routingEngine = new PreparedStatementRoutingEngine(PreparedStatementRegistry.getInstance().getSQL(statementId), - ShardingRuleRegistry.getInstance().getShardingRule(), ShardingRuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); connections = new ArrayList<>(1024); resultSets = new ArrayList<>(1024); columnTypes = new ArrayList<>(32); isMerged = false; hasMoreResultValueFlag = true; + this.databaseType = databaseType; + this.showSQL = showSQL; + sql = PreparedStatementRegistry.getInstance().getSQL(statementId); } @Override public CommandResponsePackets execute() { + return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeForMasterSlave() : executeForSharding(); + } + + private CommandResponsePackets executeForMasterSlave() { + MasterSlaveRouter masterSlaveRouter = new MasterSlaveRouter(ShardingRuleRegistry.getInstance().getMasterSlaveRule()); + SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge(); + String dataSourceName = masterSlaveRouter.route(sqlStatement.getType()).iterator().next(); + List result = new LinkedList<>(); + result.add(execute(sqlStatement, dataSourceName, sql)); + return merge(sqlStatement, result); + } + + private CommandResponsePackets executeForSharding() { + PreparedStatementRoutingEngine routingEngine = new PreparedStatementRoutingEngine(sql, + ShardingRuleRegistry.getInstance().getShardingRule(), ShardingRuleRegistry.getInstance().getShardingMetaData(), databaseType, showSQL); // TODO support null value parameter SQLRouteResult routeResult = routingEngine.route(getComStmtExecuteParameters()); if (routeResult.getExecutionUnits().isEmpty()) { @@ -104,21 +127,22 @@ public final class StatementExecuteBackendHandler implements BackendHandler { List result = new LinkedList<>(); for (SQLExecutionUnit each : routeResult.getExecutionUnits()) { // TODO multiple threads - result.add(execute(routeResult.getSqlStatement(), each)); + result.add(execute(routeResult.getSqlStatement(), each.getDataSource(), each.getSqlUnit().getSql())); } return merge(routeResult.getSqlStatement(), result); } - private CommandResponsePackets execute(final SQLStatement sqlStatement, final SQLExecutionUnit sqlExecutionUnit) { + private CommandResponsePackets execute(final SQLStatement sqlStatement, final String dataSourceName, final String sql) { switch (sqlStatement.getType()) { case DQL: case DAL: - return executeQuery(ShardingRuleRegistry.getInstance().getDataSourceMap().get(sqlExecutionUnit.getDataSource()), sqlExecutionUnit.getSqlUnit().getSql()); + return executeQuery(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); case DML: case DDL: - return executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(sqlExecutionUnit.getDataSource()), sqlExecutionUnit.getSqlUnit().getSql(), sqlStatement); + return ShardingRuleRegistry.getInstance().isOnlyMasterSlave() ? executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql) + : executeUpdate(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql, sqlStatement); default: - return executeCommon(ShardingRuleRegistry.getInstance().getDataSourceMap().get(sqlExecutionUnit.getDataSource()), sqlExecutionUnit.getSqlUnit().getSql()); + return executeCommon(ShardingRuleRegistry.getInstance().getDataSourceMap().get(dataSourceName), sql); } } @@ -170,6 +194,7 @@ public final class StatementExecuteBackendHandler implements BackendHandler { } catch (final SQLException ex) { return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); } finally { + MasterVisitedManager.clear(); if (null != preparedStatement) { try { preparedStatement.close(); @@ -179,6 +204,24 @@ public final class StatementExecuteBackendHandler implements BackendHandler { } } + private CommandResponsePackets executeUpdate(final DataSource dataSource, final String sql) { + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + setJDBCPreparedStatementParameters(preparedStatement); + int affectedRows = preparedStatement.executeUpdate(); + ResultSet resultSet = preparedStatement.getGeneratedKeys(); + long lastInsertId = 0; + while (resultSet.next()) { + lastInsertId = resultSet.getLong(1); + } + return new CommandResponsePackets(new OKPacket(1, affectedRows, lastInsertId, StatusFlag.SERVER_STATUS_AUTOCOMMIT.getValue(), 0, "")); + } catch (final SQLException ex) { + return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); + } finally { + MasterVisitedManager.clear(); + } + } + private CommandResponsePackets executeCommon(final DataSource dataSource, final String sql) { try ( Connection connection = dataSource.getConnection(); @@ -192,6 +235,8 @@ public final class StatementExecuteBackendHandler implements BackendHandler { } } catch (final SQLException ex) { return new CommandResponsePackets(new ErrPacket(1, ex.getErrorCode(), "", ex.getSQLState(), ex.getMessage())); + } finally { + MasterVisitedManager.clear(); } } @@ -364,6 +409,7 @@ public final class StatementExecuteBackendHandler implements BackendHandler { if (null != each) { try { each.close(); + MasterVisitedManager.clear(); } catch (final SQLException ignore) { } } diff --git a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/ShardingRuleRegistry.java b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/ShardingRuleRegistry.java index f779e0e4e25078e98334790f1045d5a8a4f556cb..e3b020a75defd1bbd2fcfdde64ed80e6f348bb03 100644 --- a/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/ShardingRuleRegistry.java +++ b/sharding-proxy/src/main/java/io/shardingjdbc/proxy/config/ShardingRuleRegistry.java @@ -21,9 +21,10 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import io.shardingjdbc.core.exception.ShardingJdbcException; import io.shardingjdbc.core.metadata.ShardingMetaData; +import io.shardingjdbc.core.rule.MasterSlaveRule; import io.shardingjdbc.core.rule.ShardingRule; +import io.shardingjdbc.core.yaml.proxy.YamlProxyConfiguration; import io.shardingjdbc.core.yaml.sharding.DataSourceParameter; -import io.shardingjdbc.core.yaml.sharding.YamlShardingConfigurationForProxy; import io.shardingjdbc.proxy.metadata.ProxyShardingMetaData; import lombok.Getter; @@ -40,6 +41,8 @@ import java.util.Map; * Sharding rule registry. * * @author zhangliang + * @author zhangyonglun + * @author panjuan */ @Getter public final class ShardingRuleRegistry { @@ -50,24 +53,32 @@ public final class ShardingRuleRegistry { private final ShardingRule shardingRule; + private final MasterSlaveRule masterSlaveRule; + private final ShardingMetaData shardingMetaData; + private final boolean isOnlyMasterSlave; + private ShardingRuleRegistry() { - YamlShardingConfigurationForProxy yamlShardingConfigurationForProxy; + YamlProxyConfiguration yamlProxyConfiguration; try { - yamlShardingConfigurationForProxy = YamlShardingConfigurationForProxy.unmarshal(new File(getClass().getResource("/conf/sharding-config.yaml").toURI().getPath())); + yamlProxyConfiguration = YamlProxyConfiguration.unmarshal(new File(getClass().getResource("/conf/sharding-config.yaml").toURI().getPath())); } catch (final IOException | URISyntaxException ex) { throw new ShardingJdbcException(ex); } dataSourceMap = new HashMap<>(128, 1); - Map dataSourceParameters = yamlShardingConfigurationForProxy.getDataSources(); + Map dataSourceParameters = yamlProxyConfiguration.getDataSources(); for (String each : dataSourceParameters.keySet()) { dataSourceMap.put(each, getDataSource(dataSourceParameters.get(each))); } - shardingRule = yamlShardingConfigurationForProxy.getShardingRule(Collections.emptyList()); + shardingRule = yamlProxyConfiguration.obtainShardingRule(Collections.emptyList()); + masterSlaveRule = yamlProxyConfiguration.obtainMasterSlaveRule(); + isOnlyMasterSlave = shardingRule.getTableRules().isEmpty() && !masterSlaveRule.getMasterDataSourceName().isEmpty(); try { shardingMetaData = new ProxyShardingMetaData(dataSourceMap); - shardingMetaData.init(shardingRule); + if (!isOnlyMasterSlave) { + shardingMetaData.init(shardingRule); + } } catch (final SQLException ex) { throw new ShardingJdbcException(ex); }