spring boot 整合 shardingsphere 实现分库分表的核心是引入依赖、配置数据源与分片规则,常用 shardingsphere-jdbc 模式;需配置 actual-data-nodes、分库分表策略及 mod 算法,业务代码零侵入,但分片键必须出现在 where 条件中才能精准路由。

Spring Boot 整合 ShardingSphere 实现分库分表,核心是引入对应依赖、配置数据源与分片规则,ShardingSphere 提供了 ShardingSphere-JDBC(轻量级客户端)和 ShardingSphere-Proxy(透明代理)两种模式;日常开发中,JDBC 模式最常用,无需额外部署,直接嵌入应用。
一、添加依赖(以 ShardingSphere-JDBC 5.3+ 为例)
在 pom.xml 中引入 Spring Boot Starter 和 ShardingSphere-JDBC:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-jdbc</artifactid></dependency><dependency><groupid>org.apache.shardingsphere</groupid><artifactid>shardingsphere-jdbc-spring-boot-starter</artifactid><version>5.3.2</version><!-- 建议与 Spring Boot 版本兼容,如 SB 2.7.x 用 5.3.x --></dependency><dependency><groupid>mysql</groupid><artifactid>mysql-connector-java</artifactid><scope>runtime</scope></dependency>
二、配置分库分表规则(application.yml)
以下示例实现:按 user_id 分库(2 库),再按 order_id 分表(每个库 4 张表),逻辑表为 t_order:
spring:
shardingsphere:
# 数据源定义
datasource:
names: ds0,ds1
ds0:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: 123456
ds1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: 123456
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"># 分片规则
rules:
- !SHARDING
tables:
t_order:
actual-data-nodes: ds$->{0..1}.t_order_$->{0..3}
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: t-order-table-algorithm
database-strategy:
standard:
sharding-column: user_id
sharding-algorithm-name: t-order-database-algorithm
# 自定义分片算法
sharding-algorithms:
t-order-database-algorithm:
type: MOD
props:
sharding-count: 2
t-order-table-algorithm:
type: MOD
props:
sharding-count: 4
# 开启 SQL 日志(调试用)
props:
sql-show: true说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
actual-data-nodes 表达式表示真实表路径,<code>ds$->{0..1}匹配 ds0/ds1,t_order_$->{0..3}对应 t_order_0 ~ t_order_3-
MOD算法对分片键取模,简单高效;也可自定义类实现StandardShardingAlgorithm - 若需绑定表(如
t_order和t_order_item关联查询不跨库),需配置binding-tables
三、实体类与 Mapper 保持原样(零侵入)
ShardingSphere-JDBC 在 JDBC 层拦截 SQL 并重写,业务代码完全无感:
@Data
public class Order {
private Long orderId;
private Long userId;
private String content;
}
<p>@Mapper
public interface OrderMapper {
void insert(Order order);
List<order> selectByUserId(@Param("userId") Long userId);
}</order></p>
执行 orderMapper.selectByUserId(123) 时,ShardingSphere 自动路由到 ds1.t_order_3(假设 123 % 2 = 1,123 % 4 = 3),SQL 也会自动改写为查具体物理表。
四、注意事项与常见问题
使用过程中需注意:
- 分片键必须出现在
WHERE条件中才能正确路由;否则会广播到所有库表(性能差) - 不支持跨分片的
ORDER BY + LIMIT全局排序,需用ORDER BY后加sharding-column或启用query-with-cipher-column等增强配置 - 分布式主键推荐用
SNOWFLAKE或UUID,避免自增 ID 冲突:key-generate-strategy: column: order_id, key-generator-name: snowflake - 事务默认为本地事务;如需跨库强一致性,需集成 Seata 或改用 XA 模式(性能开销大)
ShardingSphere 集成不复杂但细节多,关键是理清逻辑表、真实节点、分片策略三者映射关系。配置对了,写 SQL 和普通单库一样自然。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










