【Spring Boot 十三】 动态数据源(多数据源自动切换)

  • 内容
  • 评论
  • 相关

本文实现案例场景: 

某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库。

 

为了在开发中以最简单的方法使用,本文基于注解和AOP的方法实现,在spring boot框架的项目中,添加本文实现的代码类后,只需要配置好数据源就可以直接通过注解使用,简单方便。

 

步骤:

1. 启动类注册动态数据源 

2. 配置文件中配置多个数据源

3. 在需要的方法上使用注解指定数据源

 

1、在启动类添加 @Import({DynamicDataSourceRegister.class, MProxyTransactionManagementConfiguration.class})

 

2、配置文件配置内容为:
(不包括项目中的其他配置,这里只是数据源相关的)

 

3、使用:

 

 

 

注意:注解直接放在service层的实现类就可以,不能放在service接口层和dao接口层。

 

除了做完上面的几个步骤以外还需要添加几个配置文件

DynamicDataSource.java

DynamicDataSourceAspect.java

DynamicDataSourceContextHolder.java

DynamicDataSourceRegister.java

TargetDataSource.java

 

DynamicDataSource.java

 

 

DynamicDataSourceAspect.java

 

 

DynamicDataSourceContextHolder.java

 

 

DynamicDataSourceRegister.java

 

 

TargetDataSource.java

 

到这里,动态数据源的配置就完成了

 

接下来,说一下我在配置动态数据源的过程中遇到的困难吧。我在配置过程中,碰到最大的一个困难:数据源不切换,一直使用主数据源。然后我就开始排除问题,原因可能是动态数据源没有配置成功,断点调试,发现三个数据源都已经配置成功了,那为什么动态数据源配置成功了怎么一直使用主数据源呢?在调试过程中,根本就不进入spring aop的注解解析,然后我就在想,是不是自定义注解出了问题,上网查询各种资料,发现我的配置没有问题。我尝试着把注解放到controller上、service接口上、service实现类、dao接口上。能进入spring aop切面的就只有controller,那么我的自定义注解没问题,spring aop配置没问题,那么我就开始怀疑我的service,我在service上加入事务,发现我的事务也不生效,难道是我的service包没扫描?我把service接口和serviceImpl放到controller上,发现这是可行的,那么难道真的是我的service包出问题了?我在把service和serviceImpl注释掉的过程中,我发现了问题:我的shiroRealm类中用到的是userService,然后我把Realm用到的userService改成userDao,问题解决。

 

 

在之前的项目我碰到过这个问题,当时是事务不生效,然后折腾了好久才解决,这一次又踩到雷区,一定要记下来!!!

 

 

 

生活就是这样简单,无须在意别人的评说,走自己的路,做自己的事。人生就是这样单纯,无须在意别人的眼神,尽自己的力,出自己的汗。生活里真正关心你的,也就是那几个,不必太多的抱怨,那样自己太累。不必过多的讨好,那会迷失自己,本着良心做事就行。

喜欢 3

评论

2条评论
  1. Gravatar 头像

    然诺 回复

    检查一下service互调service的情况下事务是否失效,如果失效,核查一下底层代理

    • Gravatar 头像

      27wy.cn 回复

      @然诺 如果是同一个service不会生效,如果是不同的service则会生效。

      基于代理,同一个service下,在method1调用method2,而是直接调用方法,而不会通过代理再去访问,所以同理在同一个service下method1调method2,假设method2上有事务注解,也不会生效。

      不通service下,就不用说了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Title - Artist
0:00