ShardingSphere-JDBC 快速入门
作为轻量级 Java 驱动,ShardingSphere-JDBC 直接在应用层实现分库分表,无需独立代理服务。以下是核心实现步骤和关键配置:
一、环境准备
- 依赖配置 (Maven)
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.3.2</version> <!-- 使用最新稳定版 -->
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId> <!-- 连接池必备 -->
<version>5.0.1</version>
</dependency>
- 数据库准备
- 创建物理库:
ds0
,ds1
- 每个库创建表:
t_order_0
,t_order_1
- 创建物理库:
二、分片配置 (YAML 示例)
# config-sharding.yaml
dataSources:
ds0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/ds0
username: root
password: root
ds1:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/ds1
username: root
password: root
rules:
- !SHARDING
tables:
t_order: # 逻辑表名
actualDataNodes: ds${0..1}.t_order_${0..1} # 物理节点
databaseStrategy: # 分库策略
standard:
shardingColumn: user_id
shardingAlgorithmName: db_hash_mod
tableStrategy: # 分表策略
standard:
shardingColumn: order_id
shardingAlgorithmName: table_mod
keyGenerateStrategy: # 分布式ID
column: order_id
keyGeneratorName: snowflake
shardingAlgorithms:
db_hash_mod:
type: HASH_MOD # 哈希取模
props:
sharding-count: 2 # 库数量
table_mod:
type: MOD # 简单取模
props:
sharding-count: 2 # 表数量
keyGenerators:
snowflake:
type: SNOWFLAKE # 雪花算法
三、Java 代码集成
// 1. 加载配置创建数据源
DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(
getFile("/config-sharding.yaml")
);
// 2. 执行SQL (自动路由)
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("INSERT INTO t_order (user_id, status) VALUES (?, ?)")) {
// 写入数据 (自动计算分片位置)
ps.setLong(1, 123L); // user_id=123 → ds1 (123%2=1)
ps.setString(2, "PAID");
ps.executeUpdate();
}
// 3. 精确查询
try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM t_order WHERE order_id=?")) {
ps.setLong(1, 6354827365123456789L); // 根据雪花ID路由
ResultSet rs = ps.executeQuery();
// 结果自动聚合
}
四、关键机制解析
-
SQL 解析与路由
- 解析 SQL 提取分片键值
- 根据算法计算库表位置:
库索引 = user_id % 2
,表索引 = order_id % 2
-
分布式主键生成
// 显式获取分布式ID KeyGenerator keyGenerator = new SnowflakeKeyGenerator(); Number orderId = keyGenerator.generateKey(); // 6354827365123456789
-
绑定表配置 (避免笛卡尔积)
bindingTables: - t_order, t_order_item # 关联表使用相同分片键
五、调试技巧
- 开启 SQL 日志
# logback.xml
<logger name="org.apache.shardingsphere" level="DEBUG" />
- 日志解读示例
[INFO ] ShardingSphere-SQL - Logic SQL: SELECT * FROM t_order
[INFO ] ShardingSphere-SQL - Actual SQL: ds1 ::: SELECT * FROM t_order_1
[INFO ] ShardingSphere-SQL - Actual SQL: ds0 ::: SELECT * FROM t_order_0
六、生产注意事项
-
连接池配置
dataSources: ds0: connectionTimeoutMilliseconds: 30000 maxPoolSize: 50 # 按分库数量调整
-
分片键限制
- WHERE 条件必须包含分片键
- 跨库查询需使用逻辑表名
-
事务管理
@Bean public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); // 使用Spring事务 }
七、完整项目结构
src/main/java
├── config
│ └── ShardingConfig.java # YAML加载
├── entity
│ └── Order.java # 实体类
├── repository
│ └── OrderRepository.java # DAO层
└── Application.java # SpringBoot入口
resources
├── config-sharding.yaml # 分片配置
└── application.properties
最佳实践:使用 ShardingSphere Spring Boot Starter 可简化配置,直接通过
application.properties
加载规则。
通过此快速入门,您已掌握 ShardingSphere-JDBC 的核心配置和集成方法,下一步可深入探索分布式事务和数据加密等高级特性。