前言
之前我写过一篇数据源自动切换的博文,点击查看=>多数据源自动切换,里面用两种方式实现了多数据源自动切换,但是无论是自己实现还是用官方的轮子,都有一个痛点,就是在请求数据源不是默认数据源的时候,要重复的用注解来切换数据源,这样很繁琐,近期看到同事的一个实现,眼前一亮,觉得有必要单独写一篇文章来分享一下,实现方式原理还是和我上面那篇文章里的一样,不同的是用切面和约定的方式实现全自动切换数据源。
本次代码示例会简单表述优化的内容,不会有完整代码,建议在操作实现完多数据源自动切换里的代码后再看本文章。
正片开始
写一个数据源枚举类
@Getter
@AllArgsConstructor
public enum DBTypeEnum {
PRIMARY("primary"),
LOCAL("local"),
PROD("prod");
private final String value;
}
写一个切面类
@Component
@Order(value = -999)
@Slf4j
@Aspect
public class DataSourceSwitchAspect {
@Pointcut("execution(* com.along.mapper.primary..*.*(..)) || execution(* com.along.service.primary..*.*(..))")
private void primaryAspect() {
}
@Pointcut("execution(* com.along.mapper.local..*.*(..)) || execution(* com.along.service.local..*.*(..))")
private void localAspect() {
}
@Pointcut("execution(* com.along.mapper.prod..*.*(..)) || execution(* com.along.service.prod..*.*(..))")
private void prodAspect() {
}
@Before("primaryAspect()")
public void upms() {
DbContextHolder.setDbType(DBTypeEnum.PRIMARY);
}
@Before("localAspect()")
public void local() {
DbContextHolder.setDbType(DBTypeEnum.LOCAL);
}
@Before("prodAspect()")
public void prod() {
DbContextHolder.setDbType(DBTypeEnum.PROD);
}
}
看到这是不是很清晰了,用切面的方式,监控指定的文件夹,当请求调用到指定的文件夹里的类前,自动切换数据源为对应的数据源。
这样配置完之后我们就不在需要手动切换数据源,只需要开发过程中按照遵守项目约定好的规范,把mapper接口类放在指定的目录内,就无需关心数据库是怎么切换的。
这样基本就分享完了,改动很简单,主要就是提供一个思路,具体的实现大家在真实项目中可以根据实际情况自由发挥。