美文网首页
SpringBoot2(八):多数据源全自动切换(优化)

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

作者: 帅气滴糟老头 | 来源:发表于2023-06-20 16:38 被阅读0次

前言

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


正片开始

写一个数据源枚举类

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

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

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/fogyydtx.html