SpringBoot集成ShardingJDBC系列【2】—— 基于yaml基本配置

tech2025-05-25  7


文章只负责讲解sharding的相关配置,springboot其他的配置自己解决!! 文章内容将分开发布,便于平时查阅。


基于yaml基本配置

在application.yml配置文件中对mybatis-plus做简单的配置,这里不对Mybatis-Plus做主要配置讲解,像@MapperScan其他配置先自行了解。 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql,后续可以与sharding打印的sql做对比,更加直观发现区别 mapper-locations: classpath*:mybatis/*.xml # mapper.xml的路径
新建一个application-sharding.yml文件,对sharding-jdbc进行配置,然后在application.yml中的active添加进去即可。

Sharding-JDBC简单介绍:定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。更详细的介绍可前往 ShardingSphere官网。 分库分表包含:(垂直分库|垂直分表|水平分库|水平分表)四种类型。需要详细了解可参考其他博主的博客:彻底搞清分库分表。

接下来,将根据不同需求的对sharding进行两种配置方式。

(1) 单库分表
# 单库分表 spring: shardingsphere: datasource: names: db0 # 指定数据源名字,多数据源以逗号分隔 db0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/sharding_test1?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: 123456 sharding: # default-data-source-name: db0 # 默认数据源 tables: # 具体分片规则配置 t_user: # 逻辑表名 key-generator-column-name: id # 主键 # key-generator: # 使用雪花算法id # column: id # type: SNOWFLAKE actual-data-nodes: db0.t_user_$->{0..1} # 实际的数据节点(数据源名.逻辑表名) # 分表规则 table-strategy: inline: # 行表达式 sharding-column: uid algorithm-expression: t_user_$->{uid%2} # 按模运算分配 # 绑定表规则,即逻辑表名。(例如t_user代表了t_user_0, t_user_1, t_user_2 ...) binding-tables: t_user props: sql.show: true # 是否开启SQL显示 ### actual-data-nodes 读取数据分表策略 ### table-strategy.inline 添加数据分表策略 ### table-strategy.inline.sharding-column 添加数据分表字段(根据哪个字段插入数据到那个表,如:uid)
(2) 分库分表。可先熟悉使用,后续会出集成到多数据源来更好的使用
spring: shardingsphere: datasource: names: db0,db1 # 指定数据源名字,多数据源以逗号分隔 db0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/sharding_test_1?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: 123456 db1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/sharding_test_2?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: 123456 sharding: default-data-source-name: db0 # 默认数据源 tables: # 具体分片规则配置 t_user: #逻辑表名 key-generator-column-name: id # 主键 # key-generator: # 使用雪花算法id # column: id # type: SNOWFLAKE actual-data-nodes: db$->{0..1}.t_user_$->{0..1} # 实际的数据节点(数据源名.逻辑表名) # 分库规则 database-strategy: inline: # 行表达式 sharding-column: id algorithm-expression: db$->{id % 2} # 分表规则 table-strategy: inline: # 行表达式 sharding-column: uid algorithm-expression: t_user_$->{uid % 2} # 按模运算分配 # sys_user: # 非设置为默认数据库的,数据库中不需要分表的可以这么配,表多时候会很麻烦,后面会讲一个配置多数据源的方法,更为简便 # actual-data-nodes: db1.sys_user # table-strategy: # none: # any: none # 绑定表规则,即逻辑表名。(例如t_user代表了t_user_0, t_user_1, t_user_2 ...) binding-tables: t_user props: sql.show: true # 是否开启SQL显示
遇过的坑(注意):

原生自增主键有使用限制,不能将原生自增主键同时作为分片键使用。 由于ShardingSphere并不知晓数据库的表结构,而原生自增主键是不包含在原始SQL中内的,因此ShardingSphere无法将该字段解析为分片字段。如自增主键非分片键,则无需关注,可正常返回;若自增主键同时作为分片键使用,ShardingSphere无法解析其分片值,导致SQL路由至多张表,从而影响应用的正确性。 而原生自增主键返回的前提条件是INSERT SQL必须最终路由至一张表,因此,面对返回多表的INSERT SQL,自增主键则会返回零。

如果表中没有可以作为分片键的字段,我个人认为可以将表的主键改为成雪花算法id。对于分布式x项目或者分库的情况,则需要自定义分布式主键配置。后续也会出一篇文章专门写道。

如果只有部分数据库分库分表,我们是需要将不分库分表的表也配置在分片规则中,就像上面(2)中 被注释掉的sys_user所示那样。对于这部分具体配置说明以及我个人认为更好的配置,将在后续文章中写道。

默认的分库分表作者没有调试过,因为感觉自己项目只需要部分表的分库分表,除非你是所有表都都需要分库分表,你可以自己看文档试试。

由于MyBatis-Plus和Sharding-JDBC各自都有一套雪花算法来生成ID,下一篇文章将单独说明一下两者之间,作者在配置过程中所遇到的问题,以及解决方案。

分片的算法规则,不单只有inline表达式算法,还有像hint算法等等其他,后续会再出一篇文章讲解。


事先说明,该系列下的所有文章均为作者查阅很多配置资料后整理得出,主要用于个人记录学习的配置资料不涉及原理,仅作参考。

最新回复(0)