多数据源
2025年2月23日大约 1 分钟项目扩展多数据源
提示
随着业务的复杂性增加,单一数据源可能无法满足需求,例如读写分离、多租户独立数据库或独立 Schema 模式等。本节介绍如何基于 youlai-boot 使用 dynamic-datasource
轻松实现多数据源支持。详细内容请参考:Spring Boot3 整合 Mybatis-Plus 多数据源。
添加依赖
在 pom.xml
中添加如下依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>4.3.1</version>
</dependency>
配置多数据源
修改 application-dev.yml
文件,配置主库和从库的数据源:
spring:
datasource:
dynamic:
primary: master # 设置默认数据源
strict: false # 数据源找不到时是否抛出异常
datasource:
master: # 主库
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/youlai_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
username: root
password: 123456
slave: # 从库
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/youlai_boot_salve?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
username: root
password: 123456
多数据源测试
示例代码:
- Mapper 层:通过注解
@DS
指定使用的数据源。
/**
* 主库查询
*/
@DS("master")
@Select("select * from sys_user where id = #{userId}")
SysUser getUserFromMaster(Long userId);
/**
* 从库查询
*/
@DS("slave")
@Select("select * from sys_user where id = #{userId}")
SysUser getUserFromSlave(Long userId);
- 单元测试类:
@SpringBootTest
@Slf4j
class SysUserMapperTest {
@Autowired
private SysUserMapper userMapper;
private final Long userId = 1L;
@Test
void testSwitchDataSourceByAnnotation() {
SysUser masterUser = userMapper.getUserFromMaster(userId);
log.info("用户ID:{} 主库姓名:{}", userId, masterUser.getNickname());
SysUser slaveUser = userMapper.getUserFromSlave(userId);
log.info("用户ID:{} 从库姓名:{}", userId, slaveUser.getNickname());
}
}
测试结果如下图所示: