配置多数据源
@Configuration
public class DynamicDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid.data_00")
public DataSource data00DataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid.data_01")
public DataSource data01DataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid.data_02")
public DataSource data02DataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.data_03")
public DataSource data03DataSource(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@Primary
public DynamicDataSource dataSource(DataSource data01Source,DataSource data02DataSource,DataSource data03DataSource,DataSource data04DataSource) {
Map<Object, Object> targetDataSources = new HashMap<>(8);
targetDataSources.put(DataSourceEnum.data01.getDataSourceName(), data01Source);
targetDataSources.put(DataSourceEnum.data02.getDataSourceName(), data02Source);
targetDataSources.put(DataSourceEnum.data03.getDataSourceName(), data03Source);
targetDataSources.put(DataSourceEnum.data04.getDataSourceName(), data04Source);
return new DynamicDataSource(riskBizDataSource, data01Source);
}
数据源枚举
```java
@Getter
@AllArgsConstructor
public enum DataSourceEnum {
/**
* 业务01
*/
data_01("data_01", "业务01"),
/**
* 业务02
*/
data_02("data_02", "业务02"),
/**
*业务03
*/
data_03("data_03", "业务03"),
/**
* 业务04
*/
data_04("data_04", "业务04"),
/**
* 动态数据源
*/
DYNAMIC("dynamic", ""),
;
private String dataSourceName;
private String desc;
public static DataSourceEnum getDefault() {
return RISK_BIZ;
}
private static final Map<String, DataSourceEnum> LOOKUP = Maps.newHashMapWithExpectedSize(4);
static {
for (DataSourceEnum dataSourceEnum : EnumSet.allOf(DataSourceEnum.class)) {
LOOKUP.put(dataSourceEnum.getDataSourceName(), dataSourceEnum);
}
}
public static DataSourceEnum get(String name) {
return LOOKUP.get(name);
}
public static DataSourceEnum[] all() {
return Arrays.stream(values()).filter(dataSourceEnum -> !(dataSourceEnum.equals(DYNAMIC) || dataSourceEnum.equals(OFFLINE) || dataSourceEnum.equals(OPERATOR))).toArray(DataSourceEnum[]::new);
}
数据源做切面
@Aspect
@Component
@Order(1)
public class DataSourceAspect {
@Around("execution(* com.dao.Dynamic*Dao.*(..))")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
DataSource ds = method.getAnnotation(DataSource.class);
if (ds == null) {
DynamicDataSource.setDataSource(DataSourceEnum.data_01.getDataSourceName());
} else if (DataSourceEnum.DYNAMIC.equals(ds.name())) {
//动态参数数据源
DataSourceEnum dataSourceEnum = DataSourceEnum.getDefault();
Object[] args = point.getArgs();
for (Object arg : args) {
if (arg instanceof DataSourceEnum) {
dataSourceEnum = (DataSourceEnum) arg;
break;
}
}
DynamicDataSource.setDataSource(dataSourceEnum.getDataSourceName());
} else {
DynamicDataSource.setDataSource(ds.name().getDataSourceName());
}
try {
return point.proceed();
} finally {
DynamicDataSource.clearDataSource();
}
}
}
使用
@DataSource(name= DataSourceEnum.DATA_02)
void insert(AlarmIndicatorResultEntity alarmIndicatorResultEntity);
@DataSource(name = DataSourceEnum.DYNAMIC)
void execute(@Param("statement") String statement, DataSourceEnum dataSourceEnum);