Sharding-JDBC 核心功能详解
2025/8/15大约 3 分钟
Sharding-JDBC 核心功能详解
前置知识
在学习本教程前,请确保您已经:
- 了解 Sharding-JDBC 的基本概念
- 掌握 Spring Boot 的基础用法
- 熟悉 MySQL 主从复制原理
读写分离
1. 主从数据库配置
首先配置一个主库和两个从库:
spring:
shardingsphere:
datasource:
names: master,slave0,slave1
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_master
username: root
password: root
slave0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/demo_slave0
username: root
password: root
slave1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3308/demo_slave1
username: root
password: root
rules:
readwrite-splitting:
data-sources:
readwrite_ds:
type: Static
props:
write-data-source-name: master
read-data-source-names: slave0,slave1
load-balancer-name: round_robin
load-balancers:
round_robin:
type: ROUND_ROBIN
props:
sql-show: true
2. 负载均衡策略
Sharding-JDBC 支持多种负载均衡策略:
- 轮询(ROUND_ROBIN):按顺序轮流使用从库
- 随机(RANDOM):随机选择从库
- 权重(WEIGHT):根据权重选择从库
分片功能
1. 分片规则配置
以订单表按用户ID分库、订单ID分表为例:
spring:
shardingsphere:
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
sharding-algorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds$->{user_id % 2}
table_inline:
type: INLINE
props:
algorithm-expression: t_order_$->{order_id % 2}
2. 分片算法示例
package com.example.demo.algorithm;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import java.util.Collection;
public class CustomShardingAlgorithm implements StandardShardingAlgorithm<Long> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
// 自定义分片逻辑
long value = shardingValue.getValue();
int index = (int) (value % availableTargetNames.size());
return availableTargetNames.stream().skip(index).findFirst().orElse(null);
}
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Long> shardingValue) {
// 范围查询时返回所有分片
return availableTargetNames;
}
}
分布式序列
Sharding-JDBC 提供了多种分布式主键生成策略:
1. 雪花算法
spring:
shardingsphere:
rules:
sharding:
tables:
t_order:
key-generate-strategy:
column: order_id
key-generator-name: snowflake
key-generators:
snowflake:
type: SNOWFLAKE
props:
worker-id: 123
2. UUID生成器
spring:
shardingsphere:
rules:
sharding:
tables:
t_order:
key-generate-strategy:
column: order_id
key-generator-name: uuid
key-generators:
uuid:
type: UUID
广播表
广播表适用于数据量不大且需要与海量数据的表关联查询的场景,例如字典表:
spring:
shardingsphere:
rules:
sharding:
broadcast-tables:
- t_config
- t_dict
绑定表
绑定表适用于有关联关系的表,它们的分片规则相同:
spring:
shardingsphere:
rules:
sharding:
binding-tables:
- t_order,t_order_item
最佳实践
性能优化
合理设计分片键
- 避免跨分片查询
- 选择数据分布均匀的字段
优化读写分离
- 配置合适的从库数量
- 选择合适的负载均衡策略
合理使用广播表
- 只将数据量小的表设置为广播表
- 定期同步广播表数据
开发建议
SQL开发规范
- 避免使用子查询
- 避免使用HAVING语句
- 使用绑定表优化关联查询
事务处理
- 避免长事务
- 合理设置事务超时时间
- 考虑使用柔性事务
常见问题
1. 如何处理跨库关联查询?
处理跨库关联查询的方案:
- 使用绑定表
- 冗余关联字段
- 使用广播表
- 应用层组装
2. 如何选择分片策略?
选择分片策略的考虑因素:
- 数据量大小
- 查询特点
- 业务场景
- 扩展需求
总结
本文详细介绍了 Sharding-JDBC 的核心功能:
- ✅ 读写分离:主从库配置和负载均衡
- ✅ 分片功能:分片规则和自定义算法
- ✅ 分布式序列:主键生成策略
- ✅ 广播表:全库同步的数据表
- ✅ 绑定表:关联查询优化
下一步学习
- 学习分布式事务的实现
- 了解数据加密功能
- 探索更多高级特性
希望这篇文章能帮助您更好地理解和使用 Sharding-JDBC 的核心功能!如果您有任何问题,欢迎在评论区讨论。