springboot使用shardingsphere,进行读写分离和分表
时间: 2025-05-16 21:05:21 浏览: 28
### Spring Boot 集成 ShardingSphere 实现读写分离与分表功能
#### 1. 添加依赖
在 `pom.xml` 文件中引入必要的 Maven 依赖项:
```xml
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
```
上述代码片段展示了如何通过 Maven 引入 ShardingSphere 和 MySQL 的连接器[^4]。
---
#### 2. 数据源配置
创建两个数据源用于主从架构,分别命名为 `master_ds` 和 `slave_ds`。以下是 `application.yml` 中的数据源配置示例:
```yaml
spring:
shardingsphere:
datasource:
names: master_ds, slave_ds
master_ds:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/master_db?serverTimezone=UTC&useSSL=false
username: root
password: root
slave_ds:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/slave_db?serverTimezone=UTC&useSSL=false
username: root
password: root
```
此部分定义了主数据库和从数据库的连接信息[^2]。
---
#### 3. 配置读写分离策略
在 `application.yml` 中设置读写分离规则:
```yaml
spring:
shardingsphere:
rules:
readwrite-splitting:
data-sources:
db_read_write_split:
static-strategy:
write-data-source-name: master_ds
read-data-source-names: slave_ds
```
以上配置指定了主库负责写操作 (`master_ds`),而从库负责读取操作 (`slave_ds`) 。
---
#### 4. 分表规则配置
假设有一个名为 `t_order` 的逻辑表,实际存储分布在多个物理表中(如 `t_order_0`, `t_order_1`)。可以通过如下方式配置分表规则:
```yaml
spring:
shardingsphere:
rules:
sharding:
tables:
t_order:
actual-data-nodes: ds${0..1}.t_order_${0..1}
table-strategy:
standard:
sharding-column: order_id
precise-algorithm-class-name: com.example.demo.algorithm.ModuloTableShardingAlgorithm
```
在此配置中,`actual-data-nodes` 定义了真实表的位置分布模式,`table-strategy` 则指定基于订单 ID 进行哈希分配的具体算法类[^1]。
---
#### 5. 自定义分片算法
编写自定义分片算法以决定数据路由至哪个具体表。例如,按模运算分配订单记录:
```java
public class ModuloTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
long orderId = shardingValue.getValue();
int targetIndex = (int)(orderId % availableTargetNames.size());
return "t_order_" + targetIndex;
}
}
```
该方法接收可用目标名称集合及当前分片键值,并返回匹配的目标表名。
---
#### 6. 测试验证
完成上述配置后,在业务层调用 DAO 方法即可自动触发读写分离与分表机制。例如:
```java
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public void createOrder(OrderEntity order) {
orderRepository.save(order);
}
public List<OrderEntity> getOrders() {
return orderRepository.findAll();
}
}
```
保存新订单时会将数据写入主库对应的分表;查询订单列表则由从库处理请求[^3]。
---
阅读全文
相关推荐



















