前幾天介紹了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);
}
}