You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shardingsphere.apache.org by 橙子、 <31...@qq.com> on 2021/02/02 02:43:01 UTC
Sharding JDBC 4.0.1强制路由问题
ShardingSphere团队,你们好:
将sharding jdbc升级以后,遇到了一些问题,并结合源码进行了分析,但仍然存在了一些疑问,希望能得到解答
遇到的问题
将sharding jdbc进行了一次升级,由4.0.0-RC2升级到4.0.1,但发现,在4.0.1版本中HintManage.setDatabaseShardingValue(xxx)设置无效,执行时不会路由指定的xxx数据源,而是全库路由,并且不会进入HintShardingAlgorithm接口,但这在以前版本(4.0.0-RC2)中有效
4.0.1的源码的分析
在阅读了源码以后,发现4.0.1的强制路由逻辑为(StandardRoutingEngine):
1.解析sql,获取逻辑表logicTable(如果没有获取到,则随机返回一个数据源)
2.查看logicTable是否有路由规则,如果没有,则全库路由
3. 如果有,例如Hint策略,则根据logTable,通过HintManager.getDatabaseShardingValue(logicTable),去获得数据库路由值
4. 如果获取得到 databaseShardingValue,则进入HintShardingAlgorithm接口,反之,全库路由
由此逻辑得出,强制路需要以逻辑表作为分析来源,因此强制路由需要按如下方式进行:
1.在datasource配置时,需要给逻辑表设置为强制路由规则
TableRuleConfiguration tableRule2 = new TableRuleConfiguration("t_order"); tableRule1.setDatabaseShardingStrategyConfig(hintStrategy);
2.在执行前,使用HintManage.addDatabaseShardingValue(logicTalbe,databaseShardingValue)方法添加路由值,而不是HintManage.setDatabaseShardingValue(xxx)
4.0.0-RC2的处理
在4.0.0-RC2中的处理方式是,会存在一个专门的类DatabaseHintRoutingEngine,它的路由做法是,直接获取设置好的路由值,与logicTable无关,所以HintManage.setDatabaseShardingValue(xxx)可以使用
@Override public RoutingResult route() { //直接获取路由值,与logicTable无关 Collection<Comparable<?>> shardingValues = HintManager.getDatabaseShardingValues(); ... return result; } 4.0.1的疑问
1. 既然在4.0.1中取消了DatabaseHintRoutingEngine,那么HintManage.setDatabaseShardingValue(xxx)如何起作用
2. 如果上述分析的做法(通过配置逻辑表规则和设置逻辑表的路由值),但这样将会走sql解析流程,并不是强制路由数据源,这在性能上,可能不如4.0.0-RC2的处理
3. 查阅4.x的使用文档上,强制路由示例仍是:HintManage.setDatabaseShardingValue(xxx),但经过实际测试和下载官方的example测试,均没有达成预期路由到ds_1库,而是全库路由