千家信息网

怎么理解sharding-jdbc的ShardingMasterSlaveRouter

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章给大家分享的是有关怎么理解sharding-jdbc的ShardingMasterSlaveRouter,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,
千家信息网最后更新 2026年11月01日怎么理解sharding-jdbc的ShardingMasterSlaveRouter

本篇文章给大家分享的是有关怎么理解sharding-jdbc的ShardingMasterSlaveRouter,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

主要研究一下sharding-jdbc的ShardingMasterSlaveRouter

ShardingMasterSlaveRouter

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/router/masterslave/ShardingMasterSlaveRouter.java

@RequiredArgsConstructorpublic final class ShardingMasterSlaveRouter {        private final Collection masterSlaveRules;        /**     * Route Master slave after sharding.     *      * @param sqlRouteResult SQL route result     * @return route result     */    public SQLRouteResult route(final SQLRouteResult sqlRouteResult) {        for (MasterSlaveRule each : masterSlaveRules) {            route(each, sqlRouteResult);        }        return sqlRouteResult;    }        private void route(final MasterSlaveRule masterSlaveRule, final SQLRouteResult sqlRouteResult) {        Collection toBeRemoved = new LinkedList<>();        Collection toBeAdded = new LinkedList<>();        for (TableUnit each : sqlRouteResult.getRoutingResult().getTableUnits().getTableUnits()) {            if (!masterSlaveRule.getName().equalsIgnoreCase(each.getDataSourceName())) {                continue;            }            toBeRemoved.add(each);            String actualDataSourceName;            if (isMasterRoute(sqlRouteResult.getSqlStatement().getType())) {                MasterVisitedManager.setMasterVisited();                actualDataSourceName = masterSlaveRule.getMasterDataSourceName();            } else {                actualDataSourceName = masterSlaveRule.getLoadBalanceAlgorithm().getDataSource(                        masterSlaveRule.getName(), masterSlaveRule.getMasterDataSourceName(), new ArrayList<>(masterSlaveRule.getSlaveDataSourceNames()));            }            toBeAdded.add(createNewTableUnit(actualDataSourceName, each));        }        sqlRouteResult.getRoutingResult().getTableUnits().getTableUnits().removeAll(toBeRemoved);        sqlRouteResult.getRoutingResult().getTableUnits().getTableUnits().addAll(toBeAdded);    }        private boolean isMasterRoute(final SQLType sqlType) {        return SQLType.DQL != sqlType || MasterVisitedManager.isMasterVisited() || HintManager.isMasterRouteOnly();    }        private TableUnit createNewTableUnit(final String actualDataSourceName, final TableUnit originalTableUnit) {        TableUnit result = new TableUnit(actualDataSourceName, originalTableUnit.getDataSourceName());        result.getRoutingTables().addAll(originalTableUnit.getRoutingTables());        return result;    }}
  • ShardingMasterSlaveRouter提供了route方法,返回sqlRouteResult,这里修改了sqlRouteResult的routingResult的tableUnits的TableUnit集合

SQLRouteResult

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/SQLRouteResult.java

@RequiredArgsConstructor@Getter@Setterpublic final class SQLRouteResult {        private final SQLStatement sqlStatement;        private final GeneratedKey generatedKey;        // For multiple thread read cached sqlStatement, clone limit on SQLRouteResult, because limit will be modified after cache    // TODO need more good design here    private Limit limit;        private RoutingResult routingResult;        private OptimizeResult optimizeResult;        private final Collection routeUnits = new LinkedHashSet<>();        public SQLRouteResult(final SQLStatement sqlStatement) {        this(sqlStatement, null);    }}
  • SQLRouteResult拥有RoutingResult属性

RoutingResult

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/RoutingResult.java

@Getterpublic class RoutingResult {        private final TableUnits tableUnits = new TableUnits();        /**     * Judge is route for single database and table only or not.     *     * @return is route for single database and table only or not     */    public boolean isSingleRouting() {        return 1 == tableUnits.getTableUnits().size();    }}
  • RoutingResult拥有TableUnits属性

TableUnits

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/TableUnits.java

@Getter@ToStringpublic final class TableUnits {        private final Collection tableUnits = new LinkedHashSet<>();        /**     * Get all data source names.     *     * @return all data source names     */    public Collection getDataSourceNames() {        Collection result = new HashSet<>(tableUnits.size(), 1);        for (TableUnit each : tableUnits) {            result.add(each.getDataSourceName());        }        return result;    }        /**     * Get routing table via data source name and actual table name.     *     * @param dataSourceName data source name     * @param actualTableName actual table name     * @return routing table     */    public Optional getRoutingTable(final String dataSourceName, final String actualTableName) {        for (TableUnit each : tableUnits) {            Optional result = each.getRoutingTable(dataSourceName, actualTableName);            if (result.isPresent()) {                return result;            }        }        return Optional.absent();    }        /**     * Get actual tables group via data source name and logic tables' names.     * 

* Actual tables in same group are belong one logic name. *

* * @param dataSourceName data source name * @param logicTableNames logic tables' names * @return actual tables group */ public List> getActualTableNameGroups(final String dataSourceName, final Set logicTableNames) { List> result = new ArrayList<>(); for (String logicTableName : logicTableNames) { Set actualTableNames = getActualTableNames(dataSourceName, logicTableName); if (!actualTableNames.isEmpty()) { result.add(actualTableNames); } } return result; } private Set getActualTableNames(final String dataSourceName, final String logicTableName) { Set result = new HashSet<>(tableUnits.size(), 1); for (TableUnit each : tableUnits) { result.addAll(each.getActualTableNames(dataSourceName, logicTableName)); } return result; } /** * Get map relationship between data source and logic tables via data sources' names. * * @param dataSourceNames data sources' names * @return map relationship between data source and logic tables */ public Map> getDataSourceLogicTablesMap(final Collection dataSourceNames) { Map> result = new HashMap<>(); for (String each : dataSourceNames) { Set logicTableNames = getLogicTableNames(each); if (!logicTableNames.isEmpty()) { result.put(each, logicTableNames); } } return result; } private Set getLogicTableNames(final String dataSourceName) { Set result = new HashSet<>(tableUnits.size(), 1); for (TableUnit each : tableUnits) { if (each.getDataSourceName().equalsIgnoreCase(dataSourceName)) { result.addAll(each.getLogicTableNames(dataSourceName)); } } return result; }}
  • TableUnits内部是TableUnit的集合

TableUnit

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/TableUnit.java

@RequiredArgsConstructor@Getter@EqualsAndHashCode@ToStringpublic final class TableUnit {        private final String dataSourceName;        private final String masterSlaveLogicDataSourceName;        private final List routingTables = new LinkedList<>();        public TableUnit(final String dataSourceName) {        this.dataSourceName = dataSourceName;        masterSlaveLogicDataSourceName = dataSourceName;    }        /**     * Get routing table via data source name and actual table name.     *     * @param dataSourceName data source name     * @param actualTableName actual table name     * @return routing table     */    public Optional getRoutingTable(final String dataSourceName, final String actualTableName) {        for (RoutingTable each : routingTables) {            if (dataSourceName.equalsIgnoreCase(masterSlaveLogicDataSourceName) && each.getActualTableName().equalsIgnoreCase(actualTableName)) {                return Optional.of(each);            }        }        return Optional.absent();    }        /**     * Get actual tables' names via data source name.     *     * @param dataSourceName data source name     * @param logicTableName logic table name     * @return  actual tables' names     */    public Set getActualTableNames(final String dataSourceName, final String logicTableName) {        Set result = new HashSet<>(routingTables.size(), 1);        for (RoutingTable each : routingTables) {            if (dataSourceName.equalsIgnoreCase(this.dataSourceName) && each.getLogicTableName().equalsIgnoreCase(logicTableName)) {                result.add(each.getActualTableName());            }        }        return result;    }        /**     * Get logic tables' names via data source name.     *     * @param dataSourceName data source name     * @return  logic tables' names     */    public Set getLogicTableNames(final String dataSourceName) {        Set result = new HashSet<>(routingTables.size(), 1);        for (RoutingTable each : routingTables) {            if (dataSourceName.equalsIgnoreCase(this.dataSourceName)) {                result.add(each.getLogicTableName());            }        }        return result;    }}
  • TableUnit包含了RoutingTable的集合

RoutingTable

incubator-shardingsphere-4.0.0-RC1/sharding-core/sharding-core-route/src/main/java/org/apache/shardingsphere/core/route/type/RoutingTable.java

@RequiredArgsConstructor@Getter@EqualsAndHashCode@ToStringpublic final class RoutingTable {        private final String logicTableName;        private final String actualTableName;}
  • RoutingTable包含了logicTableName与actualTableName

小结

ShardingMasterSlaveRouter提供了route方法,返回sqlRouteResult,这里修改了sqlRouteResult的routingResult的tableUnits的TableUnit集合

以上就是怎么理解sharding-jdbc的ShardingMasterSlaveRouter,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

属性 方法 更多 知识 篇文章 实用 小结 就是 工作会 文章 看吧 知识点 行业 详情 资讯 资讯频道 跟着 部分 频道 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 广州百单互联网科技有限公司 关于新基建和互联网科技 艾特科技互联网 互联网科技ppt模板 长亮科技互联网金融 深圳期待互联网科技 多迪互联网科技有限公司 甘肃拓世互联网科技有限公司 滨湖区互联网智能科技产品供应 中国科技互联网公司收入 河南猎农互联网科技有限公司 荆州市昕露互联网络科技有限公司 江阴互联网智能科技产品进口 宇信科技在杭州互联网排第几 陕西九四连强互联网科技有限公司 银川新华互联网科技学校是国营吗 北京互联网科技类企业分布 玉溪新华互联网科技怎么选 颐高云石互联网科技 保险科技 互联网保险 互联网科技资迅 互联网金融与金融科技 互联网 新科技 隆华科技工业互联网 阿里巴巴算科技企业还是互联网 互联网保险科技创业 中和天地互联网科技有限公司 美国互联网科技公司 九思连强互联网电子科技有限公司
0