阿飞Javaer,转载请注明原创出处,谢谢!
路由条件
ParsingSQLRouter.java中决定是简单路由还是复杂路由的条件如下;
private RoutingResult route(final List<Object> parameters, final SQLStatement sqlStatement) {
Collection<String> tableNames = sqlStatement.getTables().getTableNames();
RoutingEngine routingEngine;
if (1 == tableNames.size()
|| shardingRule.isAllBindingTables(tableNames)
|| shardingRule.isAllInDefaultDataSource(tableNames)) {
routingEngine = new SimpleRoutingEngine(shardingRule, parameters, tableNames.iterator().next(), sqlStatement);
} else {
// TODO config for cartesian set
routingEngine = new ComplexRoutingEngine(shardingRule, parameters, tableNames, sqlStatement);
}
return routingEngine.route();
}
- 是否只有一张表–tableNames.size()
说明:这个”一张表”并不是指SQL中只有一张表,而是 有分库分表规则的表数量,例如下面这段构造ShardingRule的源码,tableRules()有两个表,所以tableNames.size()的值为2;如果(Arrays.asList(orderTableRule))即只有1个表,那么tableNames.size()的值为1;
ShardingRule.builder()
.dataSourceRule(dataSourceRule)
.tableRules(Arrays.asList(orderTableRule, userTableRule))
.databaseShardingStrategy(*** ***).tableShardingStrategy(*** ***) .build();
- 是否都是绑定表–shardingRule.isAllBindingTables(tableNames)
说明:isAllBindingTables(tableNames)判断tableNames是否都属于绑定表,例如下面这段构造ShardingRule的源码,.bindingTableRules()里的参数就是绑定表集合,这里是t_order和t_order_item都是绑定表,那么:
SELECT od.user_id, od.order_id, oi.item_id, od.status FROM t_order od join t_order_item oi on od.order_id=oi.order_id
这个SQL只有t_order和t_order_item两个表且都是绑定表,那么shardingRule.isAllBindingTables(tableNames)为true;
ShardingRule.builder()
.dataSourceRule(dataSourceRule)
.tableRules(Arrays.asList(orderTableRule, orderItemTableRule, userTableRule))
.bindingTableRules(Collections.singletonList(new BindingTableRule(Arrays.asList(orderTableRule, orderItemTableRule))))
. *** ***;
- 是否都在默认数据源中–shardingRule.isAllInDefaultDataSource(tableNames)
说明:sharding-jdbc判断逻辑源码如下,即只要在表规则集合中能够匹配到逻辑表,就认为不属于默认数据源中(默认数据源不分库分表),例如ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Arrays.asList(orderTableRule, orderItemTableRule, userTableRule))
,根据tableRules参数可知,主要SQL中有t_user
,t_order
,t_order_item
三个表的任意一个表,那么shardingRule.isAllInDefaultDataSource(tableNames)都为false;