java开发ShardingSphere的路由引擎类型示例详解
作者:周杰伦本人 时间:2023-11-29 01:18:56
ShardingSphere的路由引擎类型
本篇文章源码基于4.0.1版本
上篇文章我们了解到了ShardingSphere在路由流程过程中,根据不同类型的SQL会现在不同的路由引擎,而ShardingSphere支持的路由规则也很多了,包括广播(broadcast)路由、混合(complex)路由、默认数据库(defaultdb)路由、无效(ignore)路由、标准(standard)路由以及单播(unicast)路由等等,那么具体这些路由规则对应的是什么路由引擎呢?今天我们就聊聊这个。
路由引擎类型
RoutingEngineFactory 用来创建路由引擎的实例,对应的是它的newInstance()方法,根据Sql语句SQLStatement对象的类型选择不同的路由引擎,有
全库广播路由引擎DatabaseBroadcastRoutingEngine、
全库表广播路由引擎TableBroadcastRoutingEngine、
无效路由引擎IgnoreRoutingEngine、
默认数据库路由引擎DefaultDatabaseRoutingEngine(对默认的数据库进行路由)、
单播路由引擎UnicastRoutingEngine(单播路由只需要在任何数据库的任何表中获取就可以,相当于获取表中公有信息)、
数据源组的广播路由引擎DataSourceGroupBroadcastRoutingEngine、
数据库主库实例的广播路由引擎MasterInstanceBroadcastRoutingEngine(这个就是针对主库进行的操作,比如一些授权的SQL语句)
笛卡尔路由引擎CartesianRoutingEngine、
混合路由引擎ComplexRoutingEngine、
标准路由引擎StandardRoutingEngine
标准路由
标准路由是ShardingSphere推荐使用的一种分片路由策略,在进行分片表只有一个或者分片表是绑定关系,这个绑定关系是在配置文件中定义的,比如如下配置:
shardingRule:
bindingTables:
table1,table2
这个配置文件会解析成BindingTableRule集合,在进行判断绑定关系的时候根据逻辑表名获取BindingTableRule对象,判断是否在集合中,如果有就表明存在绑定关系
路由逻辑
路由逻辑在StandardRoutingEngine的route()中体现,具体逻辑是分两步走,先获取数据节点,在生成路由结果,获取路由接点对应StandardRoutingEngine的getDataNodes()方法:
private Collection<DataNode> getDataNodes(final TableRule tableRule) {
if (isRoutingByHint(tableRule)) {
return routeByHint(tableRule);
}
if (isRoutingByShardingConditions(tableRule)) {
return routeByShardingConditions(tableRule);
}
return routeByMixedConditions(tableRule);
}
如果是基于Hint的路由,具体就判断分片策略是否为HintShardingStrategy对象,调用routeByHint()方法
如果是分片条件的路由,调用isRoutingByShardingConditions()方法
否则就调用复合条件的路由
这三种情况都会调用route0()方法,先进行数据源的路由,再进行表的路由,生成数据节点
来源:https://juejin.cn/post/7127302621911908383
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java中IO流解析及代码实例详解
C#实现关闭其他程序窗口或进程代码分享
C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
Android判断用户2G/3G/4G移动数据网络
Android 基于百度语音的语音交互功能(推荐)
![](https://img.aspxhome.com/file/2023/2/90152_0s.gif)
mybatis-plus QueryWrapper 添加limit方式
Spring Boot如何通过CORS处理跨域问题
Spring Boot实现配置文件的自动加载和刷新功能
![](https://img.aspxhome.com/file/2023/1/82381_0s.png)
Android开发中ProgressDialog简单用法示例
android书架效果实现原理与代码
![](https://img.aspxhome.com/file/2023/2/137552_0s.jpg)
Java 编程中十个处理异常的建议
![](https://img.aspxhome.com/file/2023/0/96130_0s.png)
Java关键字instanceof的两种用法实例
SpringBoot中配置Web静态资源路径的方法
![](https://img.aspxhome.com/file/2023/4/72564_0s.png)
DataGridView控件显示行号的正确代码及分析
Android中AlertDialog 点击按钮后不关闭对话框的功能
![](https://img.aspxhome.com/file/2023/7/93317_0s.gif)
java统计文件中每个字符出现的个数
Spring Boot整合ElasticSearch实现多版本兼容的方法详解
![](https://img.aspxhome.com/file/2023/3/69873_0s.png)
android编程之ip2id程序实例
![](https://img.aspxhome.com/file/2023/1/138061_0s.png)