SpringBoot整合MybatisPlus实现多数据源

背景

项目中需要对数据进行冷热分离,根据数据的一些特性从热库中迁移到冷库中,查找数据时如果热库找不到需要从冷库中查找,这个时候我们希望在程序中能够使用双数据源

引入依赖

1
2
3
4
5
6
<!--多数据源-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.6.1</version>
</dependency>

配置文件配置多数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
port: 8000
spring:
datasource:
dynamic:
primary: hot# 配置默认数据库,及没有注解指定时走的数据库
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
hot:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url:
username:
password:
cold:
driver-class-name: org.postgresql.Driver
type: com.alibaba.druid.pool.DruidDataSource
url:
username:
password:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid自动加载的配置,也可以在启动类里添加

指定数据源

只需为方法加上@DS注解指明数据源即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public void insertEvent(SpiderEvent spiderEvent){
spiderEventMapper.insert(spiderEvent);
}

public List<SpiderEvent> getEventById(){
return spiderEventMapper.selectList(null);
}

@DS("hot")
public void insertByHot(SpiderEvent spiderEvent){
insertEvent(spiderEvent);
}

@DS("cold")
public void insertByCold(SpiderEvent spiderEvent){
insertEvent(spiderEvent);
}

@DS("hot")
public List<SpiderEvent> getEventByHot(){
return getEventById();
}

@DS("cold")
public List<SpiderEvent> getEventByCold(){
return getEventById();
}


多数据源事务

SpringBoot的声明式事务@Transactional所修饰的方法只占一个数据库连接,所以@DS声明的数据源不会起作用,这时候可以使用mp提供的@DSTransactional声明事务,如果方法中根据不同数据源的事务控制可以使用@Transactional控制