shardingjdbc记录

复杂路由引擎的核心逻辑就是拆分成多个简单路由,然后求笛卡尔积。当只进行一张表或者多表互为BindingTable关系时,使用 SimpleRoutingEngine 简单路由引擎。多表互为BindingTable关系时,每张表的路由结果是相同的,所以只要计算第一张表的分片即可。最后执行的时候会去执行绑定表的sql。
在这里插入图片描述

调用事务会自建一张transaction_log表,就是事务库表,记得别建重名的。
Hint强制路由是把路由保存在threadLocal里。
事务:自动设置autocommit,遍历connection集合,通过EventBus监听,对三种不同对情况进行transaction_log表对处理。最后还是失败对话,转到异步job里出来,再失败对话人工处理,transaction_log里对相对应对数据不会被删除。
事务详解:https://my.oschina.net/xiaominmin/blog/1825140
https://my.oschina.net/u/1432304/blog/1607391

简单路由和复杂路由
在这里插入图片描述
这里面会根据配置了表规则的表数量来选在那种路由引擎,如果是复杂的,complexRoutingEngine,里面会返回一个笛卡尔引擎,导致后面的笛卡尔积运算,所以这里要注意绑定表:
在这里插入图片描述

主从分离:
以下三种情况下会走主库
在这里插入图片描述
从datasource获取connection的时候会判断这个数据源有没有在配置文件里配置主从

(1)写走主库,读走从库
(2)当前线程,前面的操作走了主库,查询也要走主库。适用于进行了写的操作,然后接着查询的场景,这个时候如果读走从库,有可能会查询不到,因为主从的同步会有延迟
(3)使用Hint强制走主库
HintManager hintManager = HintManager.getInstance();
hintManager.setMasterRouteOnly();

思考一个问题:https://www.jianshu.com/p/2d0ed8451eb9
在这里插入图片描述
上海的不能用了怎么办?心跳机制将上海部分剔除?那数据的分布不就乱了吗

怎么判断执行doEqualSharding,doInSharding,doBetweenSharding?
在这里插入图片描述
shardingValue的属性,value =1,values = 0,valueRange= null,所以会走doEqualsSharding,
这三个属性在解析sql的时候被赋值

动态表实现原理:转自:芋道源码
在这里插入图片描述
个人理解:
静态:在这里插入图片描述
需要添加真是表
,动态的话就是生成tablePrefix = “goods”,后面更上_1或者_2,这个还没弄明白。

流程:
解析–>路由–>重写–>执行–>结果归并
执行流程可以看这个:https://blog.csdn.net/yanyan19880509/article/details/78008461
在路由代码中,会有强制路由的判断:https://blog.csdn.net/u012394095/article/details/81353573
在这里插入图片描述
这篇文章里说的很清楚,
在这里插入图片描述
在这里插入图片描述

绑定表,多表联合查询,笛卡尔积:想联合的话最好把几张表都绑定在一起,避免笛卡尔积
比如 t0为单表, t1,t2为绑定表:
那么每个数据源就要执行 t0:t1 , t0:t2;这是两个最小执行单位,表多了就影响性能。
上面文章里都多读两遍,还是有点理不清。。。

distinct,having不支持怎么办:https://www.cnblogs.com/yeahwell/p/7920383.html
以后可能支持
在这里插入图片描述

主从分离:更新等方法一定会走主库,getConnection()方法里会判断是否是主库,如果没配置等话一般是轮询来做负载均衡

结果归并:
order 实现:
就是将获取等值逐个放入PriorityQueue.
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值