SpringBoot2(八):多数据源全自动切换(优化)

前言

之前我写过一篇数据源自动切换的博文,点击查看=>多数据源自动切换,里面用两种方式实现了多数据源自动切换,但是无论是自己实现还是用官方的轮子,都有一个痛点,就是在请求数据源不是默认数据源的时候,要重复的用注解来切换数据源,这样很繁琐,近期看到同事的一个实现,眼前一亮,觉得有必要单独写一篇文章来分享一下,实现方式原理还是和我上面那篇文章里的一样,不同的是用切面和约定的方式实现全自动切换数据源。
本次代码示例会简单表述优化的内容,不会有完整代码,建议在操作实现完多数据源自动切换里的代码后再看本文章。


正片开始

写一个数据源枚举类

@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接口类放在指定的目录内,就无需关心数据库是怎么切换的。

这样基本就分享完了,改动很简单,主要就是提供一个思路,具体的实现大家在真实项目中可以根据实际情况自由发挥。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容