文章只负责讲解sharding的相关配置,springboot其他的配置自己解决!! 文章内容将分开发布,便于平时查阅。
基于yaml基本配置
在application.yml配置文件中对mybatis-plus做简单的配置,这里不对Mybatis-Plus做主要配置讲解,像@MapperScan其他配置先自行了解。
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*
:mybatis/*.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:
tables:
t_user:
key-generator-column-name: id
actual-data-nodes: db0.t_user_$
->{0..1
}
table-strategy:
inline:
sharding-column: uid
algorithm-expression: t_user_$
->{uid%2
}
binding-tables: t_user
props:
sql.show: true
(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
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
}
binding-tables: t_user
props:
sql.show: true
遇过的坑(注意):
原生自增主键有使用限制,不能将原生自增主键同时作为分片键使用。 由于ShardingSphere并不知晓数据库的表结构,而原生自增主键是不包含在原始SQL中内的,因此ShardingSphere无法将该字段解析为分片字段。如自增主键非分片键,则无需关注,可正常返回;若自增主键同时作为分片键使用,ShardingSphere无法解析其分片值,导致SQL路由至多张表,从而影响应用的正确性。 而原生自增主键返回的前提条件是INSERT SQL必须最终路由至一张表,因此,面对返回多表的INSERT SQL,自增主键则会返回零。
如果表中没有可以作为分片键的字段,我个人认为可以将表的主键改为成雪花算法id。对于分布式x项目或者分库的情况,则需要自定义分布式主键配置。后续也会出一篇文章专门写道。
如果只有部分数据库分库分表,我们是需要将不分库分表的表也配置在分片规则中,就像上面(2)中 被注释掉的sys_user所示那样。对于这部分具体配置说明以及我个人认为更好的配置,将在后续文章中写道。
默认的分库分表作者没有调试过,因为感觉自己项目只需要部分表的分库分表,除非你是所有表都都需要分库分表,你可以自己看文档试试。
由于MyBatis-Plus和Sharding-JDBC各自都有一套雪花算法来生成ID,下一篇文章将单独说明一下两者之间,作者在配置过程中所遇到的问题,以及解决方案。
分片的算法规则,不单只有inline表达式算法,还有像hint算法等等其他,后续会再出一篇文章讲解。
事先说明,该系列下的所有文章均为作者查阅很多配置资料后整理得出,主要用于个人记录学习的配置资料不涉及原理,仅作参考。