上一篇文章,已经介绍了,mycat在springboot工程中具体的使用
mycat这个技术栈,提供的机制和知识体系,可以系统的花时间在总结一遍
但是对于写代码而言,我们要掌握的就是配置好,技术栈
然后写用到业务逻辑里面写代码、、
写这篇文章的目的,就是,如果要彻底掌握sharding-jdbc技术栈,我们应该用什么样的思路去掌握。
1.springboot如何引入配置这个sharding-jdbc技术栈。
要配置这个技术栈,需要怎么配置,在哪里配置
2.sharding-jdbc技术栈,提供了哪些机制供使用
垂直分库,水平分表,读写分离
一、Spring Boot 引入与配置 Sharding-JDBC
1.1 引入依赖
在 Spring Boot 项目的 pom.xml 中添加 ShardingSphere-JDBC 的 Spring Boot Starter 依赖:
xml
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.5.0</version>
</dependency>
同时需要添加数据库驱动(如 MySQL)和 ORM 框架依赖(如 MyBatis 或 JPA)。
版本兼容提示:Spring Boot 2.1.x 建议搭配 Sharding-JDBC 4.1.x 版本,避免使用 5.x 版本可能存在的兼容性问题。
1.2 配置方式
ShardingSphere-JDBC 支持四种配置方式:
- Spring Boot Starter 配置 (推荐):在
application.yml或application.properties中配置 - YAML 配置 :独立的
sharding.yaml文件,通过jdbc:shardingsphere:classpath:sharding.yaml引用 - Java API 配置:通过代码构建配置对象
- Spring 命名空间配置:基于 XML 的配置方式
对于 Spring Boot 项目,最常用的是前两种方式。
1.3 核心配置结构
在 application.yml 中,ShardingSphere-JDBC 的配置主要包含以下几个层次:
yaml
spring:
shardingsphere:
# 1. 开启 SQL 日志(便于调试)
props:
sql-show: true
# 2. 定义真实数据源
datasource:
names: ds0, ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db0
username: root
password: your_password
ds1:
# 类似配置...
# 3. 规则配置(分片、读写分离等)
rules:
sharding:
tables:
# 分片表规则配置...
或者采用独立 YAML 文件的方式:
yaml
# sharding.yaml
dataSources:
ds_0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/db0
username: root
password: root
ds_1:
# 类似配置...
rules:
- !SHARDING
tables:
order:
actualDataNodes: ds_$->{0..1}.order_$->{0..1}
# 分库策略、分表策略...
二、Sharding-JDBC 提供的核心机制
Sharding-JDBC 的核心价值在于:无需改造业务代码,通过轻量级代理实现分库分表与读写分离,兼容主流 ORM 框架。
2.1 垂直分库(Vertical Partitioning)
概念:将不同业务模块的表分布到独立的数据库实例中。例如,订单表放在一个库,用户表放在另一个库,实现"专库专用",减少单库压力。
配置要点:垂直分库的配置相对简单------不同的逻辑表直接指向不同的物理数据源,不需要复杂的分片算法。
yaml
rules:
- !SHARDING
tables:
# 订单表在 ds0
t_order:
actualDataNodes: ds0.t_order
# 用户表在 ds1
t_user:
actualDataNodes: ds1.t_user
适用场景:业务模块边界清晰、表之间关联较少的系统。
2.2 水平分表(Horizontal Sharding)
概念 :将一张表的数据按一定规则拆分到多张物理表中。例如 t_order 逻辑表,实际对应 t_order_0、t_order_1 等物理表。
核心配置要素:
- 逻辑表(Logical Table) :应用代码中操作的表名,如
t_order - 真实表(Actual Table) :物理数据库中实际存在的表,如
t_order_0 - 分片键(Sharding Key) :用于决定数据路由的字段,如
order_id - 分片算法(Sharding Algorithm) :路由逻辑,如取模
order_id % 2
配置示例:
yaml
rules:
sharding:
tables:
t_order:
# 实际数据节点:2个库 × 2张表
actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
# 分库策略:基于 user_id
database-strategy:
standard:
sharding-column: user_id
sharding-algorithm-name: database-inline
# 分表策略:基于 order_id
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: table-inline
# 主键生成策略(雪花算法)
key-generate-strategy:
column: order_id
key-generator-name: snowflake
Sharding-JDBC 内置了多种分片算法,如 INLINE(Groovy 表达式)、HASH_MOD(哈希取模)、MOD(直接取模)等。
关键原则 :分库分表后,查询、更新、删除操作的条件必须带上分片键,否则会扫描所有库和表,严重影响性能。
2.3 读写分离(Read-Write Splitting)
概念:将数据库的读操作和写操作分别指向不同的数据库实例------主库负责写入,从库负责读取。
前置条件:需要先搭建 MySQL 主从复制环境。
配置要点:
primaryDataSourceName:主库数据源replicaDataSourceNames:从库数据源列表loadBalanceAlgorithm:从库负载均衡算法
yaml
rules:
- !READWRITE_SPLITTING
dataSources:
ds_ms:
primaryDataSourceName: ds_master
replicaDataSourceNames:
- ds_slave0
- ds_slave1
loadBalancerName: round_robin
loadBalancers:
round_robin:
type: ROUND_ROBIN
三、总结:掌握 Sharding-JDBC 的思路
回顾本文的核心内容,掌握 Sharding-JDBC 技术栈可以从以下三个层次入手:
| 层次 | 内容 | 关键点 |
|---|---|---|
| 引入配置 | Maven 依赖 + application.yml / sharding.yaml |
数据源定义、规则配置、SQL日志 |
| 核心机制 | 垂直分库、水平分表、读写分离 | 分片键选择、分片算法、主键生成 |
| 业务编码 | 与普通 JDBC/MyBatis/JPA 完全一致 | 注意查询条件带分片键 |
在实际开发中,Sharding-JDBC 的配置确实是最核心的工作------一旦配置完成,业务代码的编写方式和单库单表没有任何区别。这也正是 Sharding-JDBC 的设计理念:让分库分表对业务代码透明。
配置本身虽然有一定复杂度,但只要掌握了数据源定义、分片规则配置、分片算法选择这三个核心环节,就能应对大部分场景。更深入的理解(如 SQL 解析、路由、改写、结果归并等原理)可以作为进阶方向,但对于日常开发而言,配置熟练 + 业务代码正确使用分片键 就已经足够了。