什么是多数据源
多数据源指的是如果一个web项目用到了多个数据库,那么就需要连接多个数据库操作,这就是多数据源。例如:我要查询A数据库(mysql)中的数据进行处理,并将数据插入B数据库中(oracle)。
Dynamic Datasource
Dynamic-Datasource是一款动态数据源的轻量级实现,封装成Spring Starter方式引入,支持Mybatis、MybatisPlus读写分离,支持通过注解动态切换切换数据源。
@DS:指定使用数据库跟配置文件中配置的对应,可以注解在方法上和类上,同时存在方法注解优先于类上注解,强烈建议注解在service实现或mapper接口方法上。
Dynamic Datasource使用
添加Maven依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
配置主数据源和其它数据源并指定数据源名称
spring:
datasource:
dynamic:
# 指定默认数据源
primary: master
strict: false
datasource:
master:
driver-class-name: com.mysql.jdbc.Driver
url: 'jdbc:mysql://127.0.0.1:3306/cicc_report?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true'
username: root
password: root
amp:
driver-class-name: com.mysql.jdbc.Driver
url: 'jdbc:mysql://127.0.0.1:3306/amp?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true'
username: root
password: root
resource:
driver-class-name: com.mysql.jdbc.Driver
url: 'jdbc:mysql://127.0.0.1:3306/base_resource?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true'
username: root
password: root
编写代码中指定该方法使用哪个数据源 默认数据源不需要指定
@DS("amp")
public List<Integer> getHostsByResourceId(List<Integer> list){
return resourceHostMapper.getHostsByResourceIds(list);
}
@DS("resource")
public String getHostIp(Integer resourceId) {
return resourceInstanceMapper.getHostIp(resourceId);
}
如果在代码里面调用了多个数据源的方法,同时需要使用事务的话,spring的声明式事务@Transactional会失效,需要使用@DSTransactional交叉事务。
@DSTransactional
public void hostResInfo() {
List<Integer> hostIds = getHostId();
if (CollectionUtil.isEmpty(hostIds)){
return;
}
hostIds.stream().forEach(hostId->{
ReportHostInfo hostInfo = getHostInfo(hostId);
reportHostInfoService.insertOrUpdate(hostInfo);
});
}