今天分享配置多数据源的另外一种方式,SpringBo+Mybatisplus配置多数据源,此种方式配置相对简单,都是苞米豆封装好的,配置容易;此篇分享比较简单的方式配置数据源,多个固定的数据源,通过注解选择使用哪个数据源!
- 首先需要引入下面的核心依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
- yml文件中配置数据源:
server:
port: 8000
spring:
datasource:
dynamic:
# 配置默认数据库,及没有注解指定时走的数据库
primary: master
#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master: # 默认数据源配置
url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave: # 其他数据源配置
url: jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
connection-test-query: select 1
maximum-pool-size: 8
minimum-idle: 2
auto-commit: true
pool-name: DatebookHikariCP
max-lifetime: 1800000
connection-timeout: 30000
keepalive-time: 60000
3.使用示例
使用注解@DS指定数据源,给使用非默认数据源添加注解@DS,比如@DS(“slave”),如果不加或者加@DS(“master”),就会走默认数据源;@DS可以注解在 方法 上和 类 上,同时存在方法注解优先于类上注解;注解在 controller层、service 实现或 mapper 接口方法上,不要同时在 service 和 mapper 注解;
官方强烈建议加在service上,主要要保证事务!
@Service
@DS("slave")
public class UserServiceImpl extends ServiceImpl<ModelMapper, Model> implements IUserService {}
@DS("slave")
List<UserInfo> selectAll();
- 数据源失效场景
如果方法或类上添加了 @Transactional,需指定事务管理器或禁用事务自动绑定,否则另外一个数据源失效。或者去掉@Transactional,或者指定事务管理器。
@DS("slave")
@Transactional(rollbackFor = Exception.class, transactionManager = "dynamicDataSourceTransactionManager") // 显式指定事务管理器
@Override
public void updateUser(String addvcd, Integer num) {
}