ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)

shardingsphere的强制分片路由 Hint 分片算法 :(注意本本文使用的是shardingsphere 5.1.0,不同版本的shardingsphere尤其是5.X之前和之后的版本配置是不一样的)
使用场景:

在一些应用场景中,分片条件并不存在于 SQL,而存在于外部业务逻辑。 因此需要提供一种通过外部指定分片结果的方式,在 Apache ShardingSphere 中叫做 Hint。
或者是对一些特定的数据库做访问,比如这个数据库不是一个分不分表的数据库。
实现机制:
Apache ShardingSphere 使用 ThreadLocal 管理分片键值。 可以通过编程的方式向 HintManager 中添加分片条件,该分片条件仅在当前线程内生效。
除了通过编程的方式使用强制分片路由,Apache ShardingSphere 还可以通过 SQL 中的特殊注释的方式引用 Hint,使开发者可以采用更加透明的方式使用该功能。
指定了强制分片路由的 SQL 将会无视原有的分片逻辑,直接路由至指定的真实数据节点。
示例代码:
**场景一:**有一个单独的数据源,不需要做分库分表,这时候可以用HintManger在持久层访问之前,加入自己的路由逻辑就可以。你可能会有疑问那我不用shardingSphere不就可以了?以为如果你的项目是SpringBoot项目,一般会引入shardingsphere-jdbc-core-spring-boot-starter 这个Maven依赖,数据源就会被ShardingSphereDataSoure代理,这时候如果定义一个数据源只让某一个业务使用的话配置起来是比较麻烦的,这时候就可以使用HintManger 强制路由来完成这个功能。
下面代码示例:
前提条件:先配置好ShardingSphere的数据源
**下列代码可以完成的功能:**绕过ShardingSphere的sql解析直接访问d0数据库的m_user表
1、Service代码截图:
ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)_第1张图片
2、再看dao层的代码:
ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)_第2张图片
**场景二:**如果要比较复杂的强制路由条件的,而且要用到分库分表的数据库和数据表(比如:d0.m_user_0,d0.m_user_1,d1.m_user_0,d1.m_user_1 ),要直接根据一些
外部条件直接访问某一个库的某一个表(比如:d0.m_user_1)这时候因为不是根据定义的分库分表字段访问数据,此时可以使用HINT,提供的HInt算法接口HintShardingAlgorithm并配合HIntManger的设置的外部条件,完成强制路由
示例代码:
由于涉及到对分库分表后的数据进行强制路由,所以要实现 分表算法和分库算法
1、分库的算法代码:
ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)_第3张图片
2、分表的算法代码:
ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)_第4张图片
3、配置上述定义的两个算法生效:对应的配置文件配置
ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)_第5张图片
配置文件的配置代码:

#HIT分片强制路由
#打印sql
spring.shardingsphere.props.sql-show=true


#设置逻辑表m_user对应的数据库
spring.shardingsphere.rules.sharding.tables.m_user.actual-data-nodes=d$->{0..1}.m_user_$->{0..1}
# hint 分库算法名称
spring.shardingsphere.rules.sharding.tables.m_user.database-strategy.hint.sharding-algorithm-name=my-hint

#HINT分片算法自定义算法实现,配置具体的分表的算法-自定义路由的策略
spring.shardingsphere.rules.sharding.sharding-algorithms.my-hint.type=CLASS_BASED
spring.shardingsphere.rules.sharding.sharding-algorithms.my-hint.props.strategy=hint
spring.shardingsphere.rules.sharding.sharding-algorithms.my-hint.props.algorithmClassName=com.shardings.hit.MyHintShardingAlgorithm


#设置HINT强制路由分表策略
spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.hint.sharding-algorithm-name=my-table-hint
#设置算法
spring.shardingsphere.rules.sharding.sharding-algorithms.my-table-hint.type=CLASS_BASED
spring.shardingsphere.rules.sharding.sharding-algorithms.my-table-hint.props.strategy=hint
spring.shardingsphere.rules.sharding.sharding-algorithms.my-table-hint.props.algorithmClassName=com.shardings.hit.MyHintShardingAlgorithmTb

4、service代码:
ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)_第6张图片
上述配置完成后就可以完成场景二的强制路由功能了
看一下访问的结果日志:
ShardingSphere的Hint强制路由的实现详解和使用场景介绍,以及代码实现(ShardingSphere version 5.1.0)(六)_第7张图片
如果因为这个文章您理解了HINT,那么请收藏或点赞一下

你可能感兴趣的:(IT技术,java,数据库,mysql,springboot,分布式)