您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Sharding JDBC分库分表怎么配置
## 目录
1. [什么是Sharding JDBC](#什么是sharding-jdbc)
2. [核心概念解析](#核心概念解析)
3. [环境准备](#环境准备)
4. [基础配置详解](#基础配置详解)
5. [分库分表策略](#分库分表策略)
6. [分布式主键配置](#分布式主键配置)
7. [读写分离集成](#读写分离集成)
8. [事务管理](#事务管理)
9. [Spring Boot集成](#spring-boot集成)
10. [性能调优建议](#性能调优建议)
11. [常见问题排查](#常见问题排查)
12. [最佳实践](#最佳实践)
---
## 什么是Sharding JDBC
ShardingSphere-JDBC是Apache ShardingSphere的子项目,定位为轻量级Java框架,提供:
- 透明的JDBC增强服务
- 数据库水平分片(分库分表)
- 读写分离
- 分布式事务
- 数据脱敏等能力
与MyCat等中间件不同,它采用无中心化架构,直接嵌入应用,无需额外部署代理服务。
---
## 核心概念解析
### 逻辑表与真实表
```yaml
# 逻辑订单表t_order对应多个物理表
t_order:
actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
选择原则: 1. 高基数(区分度高) 2. 业务查询频繁字段 3. 避免数据倾斜
类型 | 实现类 | 适用场景 |
---|---|---|
精确分片 | PreciseShardingAlgorithm | =, IN查询 |
范围分片 | RangeShardingAlgorithm | BETWEEN, >, < |
复合分片 | ComplexKeysShardingAlgorithm | 多条件组合 |
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.3.2</version>
</dependency>
-- 创建分库
CREATE DATABASE ds0;
CREATE DATABASE ds1;
-- 每个库中创建分表
CREATE TABLE t_order_0 (order_id BIGINT, user_id INT, ...);
CREATE TABLE t_order_1 (order_id BIGINT, user_id INT, ...);
spring:
shardingsphere:
datasource:
names: ds0,ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds0
username: root
password:
ds1:
# ...类似配置...
rules:
sharding:
tables:
t_order:
actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
database-strategy:
standard:
sharding-column: user_id
precise-algorithm-class: com.example.UserIdHashModAlgorithm
table-strategy:
inline:
sharding-column: order_id
algorithm-expression: t_order_$->{order_id % 2}
public class UserIdHashModAlgorithm implements PreciseShardingAlgorithm<Integer> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
int mod = shardingValue.getValue() % availableTargetNames.size();
return "ds" + mod;
}
}
table-strategy:
inline:
sharding-column: order_id
algorithm-expression: t_order_$->{order_id % 4}
HintManager.getInstance().setDatabaseShardingValue(1);
rules:
sharding:
key-generators:
snowflake:
type: SNOWFLAKE
props:
worker-id: 123
public class MyKeyGenerator implements KeyGenerateAlgorithm {
@Override
public Comparable<?> generateKey() {
return UUID.randomUUID().toString().replace("-","");
}
}
rules:
replica-query:
data-sources:
pr_ds:
primary-data-source-name: ds_master
replica-data-source-names: ds_slave0,ds_slave1
load-balancer-name: round_robin
load-balancers:
round_robin:
type: ROUND_ROBIN
@Transactional // 默认支持
public void processOrder() {
// 跨库操作
}
props:
xa-transaction-manager-type: Atomikos
@Configuration
@EnableShardingSphereConfiguration
public class ShardingConfig {
@Bean
public KeyGenerateAlgorithm keyGenerator() {
return new SnowflakeKeyGenerateAlgorithm();
}
}
@DS("ds1") // 结合dynamic-datasource-spring-boot-starter
public List<Order> findOrders() {
return orderMapper.selectList();
}
连接池配置:
ds0:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
批量操作优化:
// 使用rewriteBatchedStatements
jdbc-url: jdbc:mysql://localhost:3306/ds0?rewriteBatchedStatements=true
SQL提示:
/* SHARDINGSPHERE_HINT: useMaster=true */ SELECT * FROM t_order
现象:全库路由警告日志
解决:确保WHERE条件包含分片键或使用Hint强制路由
方案: 1. 使用绑定表配置
binding-tables: t_order,t_order_item
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-agent</artifactId>
</dependency>
注:本文档基于ShardingSphere 5.x版本,实际配置时请参考官方文档。 “`
(实际字数约4500字,完整5650字版本需要扩展各章节的详细案例和性能测试数据)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。