文章目录

  • 前言
  • 一、引入MybatisPlus多数据源依赖
  • 二、修改yml配置
  • 三、在业务层上添加@DS注解
  • 四、相关问题
  • 1、如何在一个业务类中调用到多个数据源的数据?
  • 2、@DS和@Transactional注解冲突导致出现找不到数据源的问题



前言

在开发工作中,我们经常会遇到需要从不同的数据库中获取数据的情况,接下来就是介绍一种在SpringBoot中连接多个数据库并获取数据的方法。


一、引入MybatisPlus多数据源依赖

在项目的pom文件中添加如下依赖

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
	<version>3.3.1</version>
</dependency>

二、修改yml配置

在spring字段下添加datasource字段并写入如下内容

spring:
	# 其它配置内容
	datasource:
		dynamic:
			primary: db1 # 主数据源
			datasource: # 数据源说明
				db1:
					# 数据库驱动,这里要换成自己所用的数据库的驱动
					driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
					# 数据库地址和数据库名,这里也是要换成自己的
					url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=your-database-name
					username: sa
					password: password
				db2:
					# 数据源2的数据库驱动,可以和db1不同
					driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
					# 数据库2的地址
					url: jdbc:sqlserver://192.168.1.1:1433;DatabaseName=your-database-name
					username: sa
					password: password2

三、在业务层上添加@DS注解

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
@Service
@DS("db1") // yml中配置的数据源名
public class BussinessServiceImpl implements IBussinessService {
	// 这里的业务代码就可以使用db1的数据,但是调用不到db2的数据
}

四、相关问题

1、如何在一个业务类中调用到多个数据源的数据?

在一个业务类中无法同时调用多个数据源,建议将业务类拆分,通过组合多个业务类来实现对多数据源的读写。

2、@DS和@Transactional注解冲突导致出现找不到数据源的问题

如果直接将数据源2的业务类注入到其它数据源的业务类中,如果此时被注入的业务类开启了事务,则调用数据源2业务类方法后会出现访问不到数据源的问题,这是由于在其它业务类中当前线程绑定的仍是其它业务类自己的事务,此时当然访问不到数据源2。
有两种解决办法
1、修改业务类上@Transactional注解,添加propagation = Propagation.REQUIRES_NEW,强制将原有事务挂起并创建新事务

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)

2、将@Transactional改为@DSTransactional