mybatisplus mysql 读写分离
时间: 2025-04-27 08:26:01 浏览: 24
### MyBatis Plus MySQL 实现读写分离配置教程
#### 配置多数据源支持
为了实现MySQL的读写分离,在`pom.xml`中引入动态数据源启动器[^3]:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.6</version>
</dependency>
```
#### 数据源配置
在`application.yml`文件内指定主从库连接信息,区分master和slave的数据源设置[^4]。
```yaml
spring:
datasource:
dynamic:
primary: master # 设置默认数据源或者主库
strict: false # 关闭严格模式, 如果未匹配到对应数据源则使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/slave_db?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
```
#### 自定义SQL执行策略
针对不同类型的查询请求切换至相应的数据库实例。通常情况下,所有的更新语句都应指向主服务器;而对于只读型的操作,则可以分发给任意一台或多台副本节点处理[^1]。
可以通过AOP切面编程技术来拦截方法调用并决定当前操作应该访问哪个具体的数据源。也可以借助于某些成熟的中间件产品如Mycat或ShardingSphere简化这一过程[^2]。
例如,当遇到增删改命令时自动路由到主库,而select语法则会被导向到从库上运行:
```java
@Aspect
@Component
public class DataSourceAspect {
@Around("@annotation(com.baomidou.dynamic.datasource.annotation.DS)")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature)point.getSignature();
DS dsAnnotation = AnnotationUtils.findAnnotation(signature.getMethod(), DS.class);
DynamicDataSourceContextHolder.push(dsAnnotation.value());
try{
return point.proceed();
}finally{
DynamicDataSourceContextHolder.clear();
}
}
}
```
上述代码片段展示了如何利用Spring AOP特性创建一个环绕通知(`around`),它会在带有特定注解的方法被调用之前更改线程绑定的数据源名称,并在线程结束前恢复初始状态。
#### 测试验证
完成以上步骤之后就可以编写单元测试案例来进行功能性的检验了。确保所有涉及修改表结构或记录的行为均发生在主库之上,与此同时普通的检索类工作能够均匀分布在整个集群之中从而达到预期的效果——即减轻单点压力的同时提高了系统的整体吞吐量和服务质量。
阅读全文
相关推荐


















