SpringBoot项目实战:用ShardingSphere 5.3.2 + Druid搞定MySQL读写分离(附完整YAML配置)
·
SpringBoot整合ShardingSphere 5.3.2实现MySQL读写分离实战指南
在分布式系统架构中,数据库读写分离是提升系统性能的常见方案。本文将手把手带你用SpringBoot 2.7.10集成ShardingSphere 5.3.2和Druid连接池,通过YAML配置文件实现MySQL读写分离。不同于网上大多数教程,我们特别关注5.3.x版本带来的配置变化和实际踩坑经验。
1. 环境准备与依赖配置
首先确保你的开发环境满足以下要求:
- JDK 1.8+
- SpringBoot 2.7.10
- MySQL 5.7+/8.0
- Maven 3.6+
在pom.xml中添加关键依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.18</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>
特别注意 :
- 不要使用druid-spring-boot-starter
- 必须覆盖默认的snakeyaml版本
- 避免在application.yml中配置spring.datasource相关属性
2. 主从数据源配置
在resources目录下创建sharding-config.yaml文件,配置主从数据源:
dataSources:
master:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://主库IP:3306/数据库名?useSSL=false&serverTimezone=UTC
username: root
password: 主库密码
initialSize: 5
maxActive: 20
minIdle: 5
slave1:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://从库IP1:3306/数据库名?useSSL=false&serverTimezone=UTC
username: root
password: 从库密码
initialSize: 5
maxActive: 15
minIdle: 5
slave2:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://从库IP2:3306/数据库名?useSSL=false&serverTimezone=UTC
username: root
password: 从库密码
initialSize: 5
maxActive: 15
minIdle: 5
关键参数说明 :
| 参数 | 说明 | 推荐值 |
|---|---|---|
| initialSize | 初始连接数 | 5-10 |
| maxActive | 最大连接数 | 根据QPS调整 |
| minIdle | 最小空闲连接 | 与initialSize一致 |
| maxWait | 获取连接超时时间 | 60000ms |
3. 读写分离规则配置
在同一个sharding-config.yaml文件中继续添加读写分离规则:
rules:
- !READWRITE_SPLITTING
dataSources:
rw_ds:
staticStrategy:
writeDataSourceName: master
readDataSourceNames:
- slave1
- slave2
loadBalancerName: round_robin
loadBalancers:
round_robin:
type: ROUND_ROBIN
5.3.x版本重要变化 :
- 配置项命名全部采用驼峰式(如staticStrategy)
- 不再支持starter自动配置
- 负载均衡算法配置更加清晰
4. SpringBoot主配置
在application.yml中添加ShardingSphere驱动配置:
spring:
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:sharding-config.yaml
main:
allow-bean-definition-overriding: true
调试建议 : 开启SQL日志输出有助于排查问题:
props:
sql-show: true
5. 常见问题解决方案
5.1 数据源初始化失败
现象 :启动时报 dataSource init error 解决方案 :
- 检查Druid连接参数是否正确
- 确保网络连通性
- 验证数据库账号权限
5.2 配置项解析错误
现象 : Unable to find property 'static_strategy' 原因 :5.3.x版本必须使用驼峰命名 正确写法 :
staticStrategy: # 不是static_strategy
writeDataSourceName: master
5.3 多数据源冲突
现象 :HikariDataSource被自动加载 解决方案 :
- 确保没有引入spring-boot-starter-jdbc
- 检查是否误用了@DataSource注解
6. 高级配置技巧
6.1 事务管理
对于写操作,建议添加@Transactional注解:
@Service
public class OrderService {
@Transactional
public void createOrder(Order order) {
// 写操作会自动路由到主库
orderMapper.insert(order);
}
}
6.2 强制读主库
某些需要强一致性的场景可以强制读主库:
@GetMapping("/detail")
public Order getOrderDetail(Long orderId) {
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.setWriteRouteOnly();
return orderMapper.selectById(orderId);
}
}
6.3 多从库负载均衡策略
除了默认的轮询(ROUND_ROBIN),还支持:
| 策略类型 | 描述 | 适用场景 |
|---|---|---|
| RANDOM | 随机选择 | 简单均衡 |
| WEIGHT | 权重分配 | 异构从库 |
| TRANSACTION | 事务内固定 | 业务关联查询 |
配置示例:
loadBalancers:
custom_weight:
type: WEIGHT
props:
slave1: 2
slave2: 1
7. 性能优化建议
-
连接池配置 :
- 主库连接数应大于从库
- 根据实际QPS调整maxActive
-
监控配置 :
# Druid监控页
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
- 慢SQL阈值 :
dataSources:
master:
# ...
connectionProperties: druid.stat.slowSqlMillis=500
实际项目中,我们通过这套配置方案将查询性能提升了3倍,同时保证了写操作的一致性。特别是在促销活动期间,读写分离架构有效分担了数据库压力。
更多推荐


所有评论(0)