MybatisPlus多数据源配置
1.简介
多数据源即需要在不同库上进行操作时所需要的配置,分为不同服务跨库进行操作、相同服务跨库进行操作,本例中按照mybatisPlus的方法进行操作处理。
这种也可以称为动态数据源,主要操作是在方法上、类上或者mapper上进行@DS(“配置好的数据源的名称”)注解的标注,动态切换数据源,没有标注的会使用默认配置的数据源,标注的名字的则会使用已存在的配置的这个名字的数据源,简单便捷~
2.mybatisPlus多数据源操作
2.1 首先是导入多数据源的依赖
注意一点是次数导入的依赖的版本号需要与项目其他相关的使用mybatisPlus的版本号保持一致,要不一致可能会导致循环依赖(不同版本直接,不知道用哪一个)的情况。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
2.2 配置application.yml中的多数据源
此处以mysql为例,其中dynamic下的primary为默认的数据源,在后面使用中,如果没有使用@DS进行标注使用其他的数据源,会默认使用此处的数据源。
在spring.datasource.dynamic.datasource下是配置的多数据源,名称可以任意起,可以配置很多个。
#配置数据源
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource # 数据源类型:HikariCP
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: password
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: password
2.3 使用
只需要在方法或者类名上加@DS(“上面配置的多数据源签名的名字”),即可开启多数据源的查询操作。
其中多数据源在不切换数据源的sql查询是这样的 select * from 数据库1.t1 LEFT JOIN 数据库2.t2 ON 数据库1.t1.id = 数据库2.t2.id,只需要在我们正常的sql中的字段前面加上数据库名就可以了,这里是适用于同服务不同库直接的操作。
@DS("slave")
public XXX test(XXX xxx...) {
}
使用时需要注意以下几点:
2.3.1 不能使用事务,否则数据源不会切换,使用的还是第一次加载的数据源;
2.3.2 第一次加载数据源之后,第二次、第三次…操作其它数据源,如果数据源不存在,使用的还是第一次加载的数据源;
2.3.3 数据源名称不要包含下划线,否则不能切换。
2.4 一次使用多个数据源进行操作
一次使用多个数据源进行操作,是通过多线程的方法开启多个个连接进行操作的。参考
由于没有相关业务暂时没有测试过下面这种方法,在此记录一下待后面有空了进行测试总结~
@Override
@DataSource(value = DataSourceNames.TWO)
public Map<String, Object> getSandardByReportId(Integer id) {
ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return getStandardIdBy(id);
}
});
executor.submit(task);
Map<String, Object> map = null;
try {
map = getSandardMapById(task.get());
return map;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
} catch (ExecutionException e) {
e.printStackTrace();
return null;
}
}
@DataSource(value = DataSourceNames.TWO)
public Map<String, Object> getSandardMapById(Integer id) {
Map<String, Object> map = craftExtrCheckStandardMapper.getStandardById(id);
return map;
}
@DataSource(value = DataSourceNames.ONE)
public Integer getStandardIdBy(Integer reportId) {
Integer checkIdByReportId = extrProductOrderMapper.getCheckIdByReportId(reportId);
return checkIdByReportId;
}
因为所需要处理的业务在同一个服务器上的跨库操作,所以暂时没有测过不同服务直接的跨库操作,还有上面这种@DS和事务一起使用的情况暂时没有测过。
以上就是今天爬坑内容,爬完一个坑还有另一个坑,希望后面能顺顺利利的~加油~
- 点赞
- 收藏
- 关注作者
评论(0)