装饰器扩展点
- org.apache.shardingsphere.underlying.route.decorator.RouteDecorator
- org.apache.shardingsphere.underlying.rewrite.context.SQLRewriteContextDecorator
- org.apache.shardingsphere.underlying.merge.engine.decorator.ResultDecoratorEngine
- org.apache.shardingsphere.underlying.merge.engine.merger.ResultMergerEngine
路由装饰器RouteDecorator是ShardingSphere最重要的扩展点之一,它主要负责ShardingKey校验,组装路由条件ShardingConditions,根据SQL类型创建路由引擎并获取路由结果等,为SQL重写做准备。
ShardingKey校验
ShardingSphere 提供两种类型校验器用于校验更新ShardingKey是否合法。
ShardingStatementValidatorFactory.newInstance(
sqlStatementContext.getSqlStatement()).ifPresent(validator -> validator.validate(shardingRule, sqlStatementContext.getSqlStatement(), parameters));
- ShardingInsertStatementValidator 用于校验
INSERT INTO .... ON DUPLICATE KEY UPDATE
语句中是否含有ShardingKey,如果包含则抛异常不允许更新; - ShardingUpdateStatementValidator 用于校验更新的字段中是否含有ShardingKey,如果包含则抛异常。
添加该校验的目的是避免更新ShardingKey导致后续路由错误。
组装路由条件ShardingConditions
根据SQL类型,组装路由引擎执行所需的参数。由于insert和其他带where条件的SQL处理逻辑不同,所以分别进行处理,通过InsertClauseShardingConditionEngine和WhereClauseShardingConditionEngine来组装ShardingConditions,ShardingConditions中包括ShardingKey与ShardingValue的映射
获取路由结果
根据SQL类型获取路由引擎,执行路由引擎的route方法获取路由结果,
在route方法中会根据shardingKey对应的ShardingValue去执行SQL对应逻辑表的分库分表算法获取真实路由库表。
应用
在该扩展点中可以根据业务场景定制化实现SDK,满足业务需求,如:是否允许更新ShardingKey,是否开启强制路由。
允许更新ShardingKey
在某些业务场景下需要对ShardingKey进行Update操作,但ShardingJDBC对更新ShardingKey进行了强校验,不允许更新ShardingKey,避免路由错误。
可以对ShardingKey校验增加一个开关,由业务控制是否打开校验开关
private static final ThreadLocal