Spring Boot数据访问之声明式动态数据源切换

  在Spring Boot数据访问之多数据源配置及数据源动态切换中详述了如何配置多数据源及多数据源之间的动态切换。其读数据库时需加上一大段RoutingDataSourceContext ctx = ...代码(硬编码),使用起来十分不便。有没有方法可以简化呢?当然可以啦。

  回顾一下声明式事务SpringAOP应用之声明式事务中可以利用@Transactional() 注解。将其放在某个Java方法上,这个方法就动具有了事务的功能。我们也可以编写类似的@RoutingWith("slaveDataSource")注解放到某个方法上,这个方法内部就自动选择了对应的数据源。参考Spring核心思想之 AOP:基础概念及注解式AOP初体验中自定义注解拦截方式,优化动态数据源的切换。具体操作如下:

  1)添加坐标

                

   2)编写自定义拦截注解  

                

   3)Aspect类

                

   4)测试类:

                

   5)Service类:

                

   测试结果:

                

                

 补充注意:

  在上述步骤的第四步中将数据源选择注释后并没有直接在测试类中直接使用@RoutingWith注解,而是在第五步的Service服务中添加。如果不按这个添加使用注解加AOP方式进行动态数据源路由是失败的(亲测,切面类无效)。

  为什么呢?这与动态选择数据源的实现原理有关:

    现在项目的结构设计基本上是基于MVC的,那么数据库的操作集中在dao层完成,主要业务逻辑在service层处理,controller层处理请求。假设在执行dao层代码之前能够将数据源(DataSource换成想要执行操作的数据源,那么这个问题就解决了。

                

   对于使用Mybatis进行数据持久化操作,在SessionFactory实例化之前就应将数据源选择好。在示例的案例中,在测试类中选择数据源时SessionFactory已经进行了实例化的操作(即数据源已经作为参数注入到sesionFactory对象),所以无效。

 

 

 

posted on 2021-11-25 10:06  池塘里洗澡的鸭子  阅读(260)  评论(0编辑  收藏  举报