多数据源的功能简介

  • 在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();
}