前几天介绍了spring boot用AOP切片实现多数据源管理,今天介绍一下用dynamic-datasource-spring-boot-starter实现多数据源,相对AOP切片方式,这种实现起来更简单,只需要引入依赖,在application配置文件进行相应配置,就可以在代码中使用注解实现数据源切换。
dynamic-datasource-spring-boot-starter是一个基于springboot的快速集成多数据源的启动器,它可以方便地实现数据源的动态切换和主从分离,支持多种数据库类型,如oracle和mysql。
要使用dynamic-datasource-spring-boot-starter实现多数据源管理,只需要以下几个步骤:
在springboot项目中添加dynamic-datasource-spring-boot-starter的依赖和druid连接池依赖,如下所示:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
在application.yml文件中配置数据源信息,如下所示:
spring:
datasource:
dynamic:
primary: master # 设置默认的数据源或者数据源组,默认值即为master
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 指定数据源类型为druid
druid: # 配置druid的属性
initial-size: 5 # 初始化连接数
min-idle: 5 # 最小空闲连接数
max-active: 20 # 最大活跃连接数
max-wait: 60000 # 获取连接的最大等待时间,单位毫秒
# 其他属性省略
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 其他属性省略
oracle:
url: jdbc:oracle:thin:@//xx.xx.xx.xx:1521/dynamic
username: root
password: 123456
driver-class-name: oracle.jdbc.OracleDriver
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 其他属性省略
在代码中使用@DS注解来指定使用哪个数据源,如下所示:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@DS("slave_1") // 使用slave_1数据源
public List<User> list() {
return userMapper.selectList(null);
}
@Override
@DS("master") // 使用master数据源
public boolean save(User user) {
return userMapper.insert(user) > 0;
}
@Override
@DS("oracle") // 使用oracle数据源
public User getById(Long id) {
return userMapper.selectById(id);
}
}