SpringBoot 动态数据源切换
时间: 2023-07-18 17:46:51 浏览: 124
SpringBoot 中实现动态数据源切换有多种方式,其中一种比较常用的方式是通过使用 AbstractRoutingDataSource 类和 ThreadLocal 来实现。
具体步骤如下:
1. 创建一个继承 AbstractRoutingDataSource 类的类,重写 determineCurrentLookupKey 方法,该方法返回一个字符串作为数据源的 key。
2. 在配置文件中配置多个数据源,每个数据源都需要配置一个 key 作为标识。
3. 在需要进行数据源切换的地方,调用 DataSourceContextHolder 类的 setDataSourceKey 方法设置当前数据源的 key。
4. 在需要使用数据源的地方,通过调用 DataSourceContextHolder 类的 getDataSourceKey 方法获取当前数据源的 key。
5. 在配置类中配置事务管理器时,需要将动态数据源作为参数传递给事务管理器。
示例代码如下:
1. 创建 DynamicDataSource 类
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
```
2. 在配置文件中配置多个数据源
```yaml
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/master
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/slave
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
```
3. 设置当前数据源的 key
```java
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String key) {
contextHolder.set(key);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
```
4. 获取当前数据源的 key
```java
String dataSourceKey = DataSourceContextHolder.getDataSourceKey();
```
5. 配置事务管理器
```java
@Bean
public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
```
以上是一种常用的动态数据源切换方式,可以根据具体需求进行扩展和优化。
阅读全文