多数据源的功能简介
- 在yml文件中配置默认主数据源。
- 项目启动后能动态增减数据源。
- 支持多租户架构,使用spel动态参数解析数据源,如从session,header和参数中获取数据源。
- 多层数据源嵌套切换。(一个业务ServiceA调用ServiceB,ServiceB调用ServiceC,每个Service都是不同的数据源)
- 数据源分组,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
- 使用正则匹配或spel表达式来切换数据源
- 每个模块或者插件可以访问不同的数据源,把系统数据库和业务数据库做到完全隔离。
- 性能无损耗。
1 新建数据源
打开 数据管理/数据库连接
添加你的数据库连接,测试通过就可以使用该数据源了。 注意:连接英文名是数据源的唯一标志,不可重复。
备注:代码生成器/图表组件/仪表盘设计都用到了该功能。
2 使用 @DS 切换数据源。
@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解,强烈建议只注解在service实现上,没有@DS时,或者DS注解的数据源不存在时使用默认数据源。
使用方法:@DS("dsName"), dsName是数据库连接的英文名。
使用示例: findList访问数据源jee4, service中的其它方法访问jee3。
@DS("jee3")
@Service
@Transactional(readOnly = true)
public class LeaveForm1Service extends CrudService {
public LeaveForm1 get(String id) {
return super.get(id);
}
@DS("jee4")
public List findList(LeaveForm1 leaveForm1) {
return super.findList(leaveForm1);
}
public Page findPage(Page page, LeaveForm1 leaveForm1) {
return super.findPage(page, leaveForm1);
}
@Transactional(readOnly = false)
public void save(LeaveForm1 leaveForm1) {
super.save(leaveForm1);
}
@Transactional(readOnly = false)
public void delete(LeaveForm1 leaveForm1) {
super.delete(leaveForm1);
}
}
3 动态参数解析数据源
@DS("#session.tenantName")//从session获取
public List selectSpelBySession() {
return userMapper.selectUsers();
}
@DS("#header.tenantName")//从header获取
public List selectSpelByHeader() {
return userMapper.selectUsers();
}
@DS("#tenantName")//使用spel从参数获取
public List selectSpelByKey(String tenantName) {
return userMapper.selectUsers();
}
@DS("#user.tenantName")//使用spel从复杂参数获取
public List selecSpelByTenant(User user) {
return userMapper.selectUsers();
}