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控制