sharding-jdbc 是 apache shardingsphere 的轻量级 jdbc 封装,以 jar 包形式嵌入 java 应用,无需额外中间件,适合在 spring boot 项目中快速实现分库分表。

1. 引入依赖和基础配置
在 pom.xml 中添加 ShardingSphere-JDBC 的 Starter(推荐 5.x 版本,与 Spring Boot 2.7+/3.x 兼容):
同时保留你原本的数据库驱动(如 MySQL Connector/J),不要使用 ShardingSphere 自带的驱动类,仍用 com.mysql.cj.jdbc.Driver。
在 application.yml 中配置数据源、分片规则和主键生成策略:
- 定义多个真实数据源(如 ds0、ds1),每个指向一个物理库
- 指定逻辑表名(如
t_order)及其分片规则:按库列(databaseStrategy)+ 按表列(tableStrategy) - 配置分布式主键(如 snowflake),用于生成不重复的 order_id
2. 定义分片策略
常见场景是「用户 ID 分库 + 订单时间分表」或「订单 ID 取模分库分表」。例如:
- 用
user_id % 2决定路由到 ds0 还是 ds1 - 用
order_id % 4决定写入t_order_0到t_order_3中哪张表
这些逻辑可通过内置的 ModuloShardingAlgorithm 实现,也可自定义类实现 StandardShardingAlgorithm 接口,接收 shardingValue 并返回目标库/表名。
注意:分片键(如 user_id)必须出现在 SQL 的 WHERE 条件中,否则可能全库路由,影响性能。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
3. 使用方式透明,SQL 基本不用改
Sharding-JDBC 在 JDBC 层拦截 SQL,自动改写并路由。你写的还是原生 SQL 或 MyBatis 的 <select></select> 标签,比如:
SELECT * FROM t_order WHERE user_id = ? AND order_id = ?
框架会根据 user_id 算出库,再根据 order_id 算出表,最终只查询单个真实数据节点。JOIN、分页、ORDER BY 等也支持(部分复杂场景需配置广播表或绑定表避免笛卡尔积)。
MyBatis Mapper 接口和 XML 不需要修改,Mapper 中的 @Select("...") 同样生效。
4. 注意事项和避坑点
实际落地时容易忽略的关键细节:
- 事务:默认仅支持本地事务;如跨库更新,需启用
XA或Seata配合,但性能下降明显 - 分布式主键:避免用数据库自增,必须配置
key-generate-strategy,否则分表后主键冲突 - 分页:LIMIT + OFFSET 跨多节点时,Sharding-JDBC 会归并结果,大数据量慎用;推荐用 > 最大 ID 的游标分页
- DDL 操作:不能直接执行
ALTER TABLE t_order ADD COLUMN,需在所有真实表上手动执行
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










