复杂路由引擎的核心逻辑就是拆分成多个简单路由,然后求笛卡尔积。当只进行一张表或者多表互为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.