ShardingSphere-JDBC
ShardingSphere-JDBC 是一个轻量级的 Java 框架,它作为增强版的 JDBC 驱动嵌入到你的应用中,让你像操作单库单表一样操作分库分表后的数据,对业务代码几乎无侵入。
🧩 核心概念速览
在动手配置前,先理解几个关键术语:
- 逻辑表 (Logic Table):你代码中使用的“表名”,比如
t_order,是拆分后所有真实表的总称。 - 真实表 (Actual Table):数据库中实际存在的物理表,例如
t_order_0、t_order_1。 - 数据节点 (Data Node):分片的最小单元,由数据源名称和真实表组成,如
ds0.t_order_0。 - 分片键 (Sharding Column):用于决定数据路由到哪个库或表的字段,例如
user_id或order_id。 - 分片算法 (Sharding Algorithm):根据分片键的值计算出目标数据节点的规则,如取模、哈希等。
🚀 快速入门实操
我们以一个经典的“2库2表”场景为例:根据 user_id 取模分库,根据 order_id 取模分表。
1. 环境与依赖准备
确保你的项目环境为 JDK 17+、Spring Boot 3.x、MySQL 8.0+。
在 pom.xml 中引入核心 Starter 依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.3.2</version> <!-- 建议使用5.3.x稳定版 -->
</dependency>
2. 数据库准备
你需要提前创建好物理库和表。在这个例子里,你需要创建 ds0 和 ds1 两个数据库,并在每个库中分别创建 t_order_0 和 t_order_1 两张结构相同的表。
3. 核心配置 (application.yml)
这是最关键的一步,配置真实数据源、分片规则和算法。
spring:
shardingsphere:
# 1. 配置真实数据源
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false
username: root
password: your_password
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC&useSSL=false
username: root
password: your_password
# 2. 配置分片规则
rules:
sharding:
tables:
t_order: # 逻辑表名
actual-data-nodes: ds${0..1}.t_order_${0..1} # 数据节点分布
database-strategy: # 分库策略
standard:
sharding-column: user_id
sharding-algorithm-name: database-inline
table-strategy: # 分表策略
standard:
sharding-column: order_id
sharding-algorithm-name: table-inline
key-generate-strategy: # 分布式主键策略
column: order_id
key-generator-name: snowflake
# 3. 配置分片算法
sharding-algorithms:
database-inline:
type: INLINE
props:
algorithm-expression: ds${user_id % 2} # user_id取模2决定库
table-inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 2} # order_id取模2决定表
key-generators:
snowflake:
type: SNOWFLAKE
配置说明:actual-data-nodes 定义了数据分布;database-strategy 和 table-strategy 分别指定了分库和分表使用的分片键与算法名称;sharding-algorithms 则用 INLINE 类型的内联表达式实现了简单的取模逻辑。
4. 业务代码编写
配置完成后,你的业务代码不需要任何改动。注入普通的 DataSource,照常使用 JdbcTemplate 或 MyBatis 即可。ShardingSphere 会在 JDBC 层自动拦截 SQL,完成路由和结果合并。
@Service
public class OrderService {
@Autowired
private JdbcTemplate jdbcTemplate; // 或注入你的 MyBatis Mapper
public void createOrder(Long userId, Long orderId) {
// 你写的还是针对逻辑表 t_order 的普通SQL
String sql = "INSERT INTO t_order (order_id, user_id, price) VALUES (?, ?, ?)";
// 框架会自动根据 user_id 和 order_id 路由到正确的库和表
jdbcTemplate.update(sql, orderId, userId, 99.9);
}
}
⚠️ 重要注意事项
- 分片键必须出现在 SQL 的
WHERE条件中:否则框架无法路由,会执行全库全表路由,性能极差。 - 分布式主键:分表后数据库自增主键会冲突,必须配置
key-generate-strategy(如SNOWFLAKE)来生成全局唯一 ID。 - 事务支持:默认仅支持本地事务。如果需要跨库事务,需要引入 XA 或 Seata 等分布式事务方案,但这会带来性能损耗。
- DDL 操作:
ALTER TABLE等 DDL 语句不会自动在所有真实表上执行,需要你手动在所有分片上操作。 - 分页查询:跨多个数据节点的
LIMIT分页,框架需要归并结果,在数据量很大时性能会下降,建议考虑使用基于 ID 的游标分页。
浙公网安备 33010602011771号