使用AbstractRoutingDataSource配置多数据源
时间: 2023-12-10 13:06:09 浏览: 137
数据配置多数据源
使用AbstractRoutingDataSource可以很方便地配置多数据源,具体步骤如下:
1.自定义动态数据源类DynamicDataSource,继承AbstractRoutingDataSource类,并实现determineCurrentLookupKey()方法,该方法返回当前数据源的key值。
2.在Spring配置文件中配置多个数据源,并将DynamicDataSource作为默认数据源。
3.使用AOP技术,在方法执行前动态切换数据源。
下面是一个简单的示例:
```java
// 自定义动态数据源类
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DbContextHolder.getDataSource();
}
}
// 数据源上下文,用于存储当前线程使用的数据源key值
public class DbContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
public static String getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove(); }
}
// 配置多个数据源
@Bean(name = "dataSource1")
public DataSource dataSource1() {
// ...
}
@Bean(name = "dataSource2")
public DataSource dataSource2() {
// ...
}
@Bean(name = "dynamicDataSource")
public DynamicDataSource dynamicDataSource() {
DynamicDataSource dataSource = new DynamicDataSource();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("dataSource1", dataSource1());
targetDataSources.put("dataSource2", dataSource2());
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(dataSource1());
return dataSource;
}
// 使用AOP动态切换数据源
@Aspect
@Component
public class DataSourceAspect {
@Pointcut("@annotation(com.gnxk.datasource.annotation.DataSource)")
public void dataSourcePointCut() {
}
@Before("dataSourcePointCut()")
public void before(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
DataSource dataSource = signature.getMethod().getAnnotation(DataSource.class);
if (dataSource == null) {
DbContextHolder.setDataSource("dataSource1");
} else {
DbContextHolder.setDataSource(dataSource.value());
}
}
@After("dataSourcePointCut()")
public void after(JoinPoint joinPoint) {
DbContextHolder.clearDataSource();
}
}
```
使用注解@DataSource("dataSource1")或@DataSource("dataSource2")来指定使用哪个数据源。
阅读全文