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团队,你们好:
&nbsp; 将sharding jdbc升级以后,遇到了一些问题,并结合源码进行了分析,但仍然存在了一些疑问,希望能得到解答


遇到的问题
&nbsp; 将sharding jdbc进行了一次升级,由4.0.0-RC2升级到4.0.1,但发现,在4.0.1版本中HintManage.setDatabaseShardingValue(xxx)设置无效,执行时不会路由指定的xxx数据源,而是全库路由,并且不会进入HintShardingAlgorithm接口,但这在以前版本(4.0.0-RC2)中有效


4.0.1的源码的分析
&nbsp; 在阅读了源码以后,发现4.0.1的强制路由逻辑为(StandardRoutingEngine):
&nbsp; &nbsp; 1.解析sql,获取逻辑表logicTable(如果没有获取到,则随机返回一个数据源)
&nbsp; &nbsp; 2.查看logicTable是否有路由规则,如果没有,则全库路由
&nbsp; &nbsp; 3.&nbsp;如果有,例如Hint策略,则根据logTable,通过HintManager.getDatabaseShardingValue(logicTable),去获得数据库路由值
&nbsp; &nbsp; &nbsp;4.&nbsp;如果获取得到 databaseShardingValue,则进入HintShardingAlgorithm接口,反之,全库路由
&nbsp;&nbsp;
由此逻辑得出,强制路需要以逻辑表作为分析来源,因此强制路由需要按如下方式进行:
&nbsp; 1.在datasource配置时,需要给逻辑表设置为强制路由规则
TableRuleConfiguration tableRule2 = new TableRuleConfiguration("t_order"); tableRule1.setDatabaseShardingStrategyConfig(hintStrategy);
&nbsp; 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<?&gt;&gt; shardingValues = HintManager.getDatabaseShardingValues();     ...     return result; }&nbsp; 4.0.1的疑问
1.&nbsp;既然在4.0.1中取消了DatabaseHintRoutingEngine,那么HintManage.setDatabaseShardingValue(xxx)如何起作用
2.&nbsp;如果上述分析的做法(通过配置逻辑表规则和设置逻辑表的路由值),但这样将会走sql解析流程,并不是强制路由数据源,这在性能上,可能不如4.0.0-RC2的处理
3.&nbsp;查阅4.x的使用文档上,强制路由示例仍是:HintManage.setDatabaseShardingValue(xxx),但经过实际测试和下载官方的example测试,均没有达成预期路由到ds_1库,而是全库路由