SpringBoot多数据源-DynamicDataSource
- 1.多数据源应用场景
- 2.DynamicDataSource原理
- 3.DynamicDataSource使用
- 3.1 导入依赖
- 3.2 application.yml多数据源配置
- 4.测试
1.多数据源应用场景
- 读写分离:数据库主节点压力比较大,需要增加从节点提供读操作,以减少压力。
- 多数据源:一个复杂的单体项目,因为没有拆分成不同的服务,需要连接多个业务的数据源。
- 多租户数据源切换:大型租户,每个租户有独立的数据源,需要根据当前租户切换对应的数据源
2.DynamicDataSource原理
- 使用 AOP 拦截,方法执行前获取到当前方法要用的数据源
- 实现自定义 DataSource 接口,实现 DataSource 接口的 getConnect 方法做动态处理
参考:MyBatis Plus 插件 动态数据源实现原理与源码讲解 (dynamic-datasource-spring-boot-starter-master)
3.DynamicDataSource使用
3.1 导入依赖
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1</version></dependency>
3.2 application.yml多数据源配置
spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test_masterusername: rootpassword: rootslave_1:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test_slaveusername: rootpassword: rootmybatis:type-aliases-package: com.rql.entitymapper-locations: classpath:mybatis/*.xml
4.测试
直接使用注解的形式@DS("数据源名称")
java">
@RestController
@RequestMapping("/user")
public class UserController {@AutowiredUserDao userDao;@GetMapping("/a")@DS("slave_1")public List<User> findAll(){return userDao.findAll();}@PostMapping("/b")@DS("master")public void inserUser(@RequestBody User user){userDao.inserUser(user);}
}