springboot mybatis 中 多数据源切换无效的问题

多数据源无效问题

输出当前数据源的连接,以便观察数据源的切换情况

@Bean
public class DbUtil {

    @Autowired
    private DataSource dataSource;

    public  Connection getCurrentConn(){
        DynamicRoutingDataSource dynamicRoutingDataSource = (DynamicRoutingDataSource) dataSource;

        Connection connection = null;
        try {
            connection =  dynamicRoutingDataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    }
}

多数据源失效的原因之一

代理问题

spring 用的是cglib代理,cglib的代理是以继承父类的方式实现的

class A{
  @DS("aa")
   test(){
      test1();
   }

  @DS("bb")
   test1(){
   }
}

//模拟代理A类之后的实例
class B extends A{
  
}

//应用实际拿到是这样的对象
 Bean caller = new B();


//代理开始
//执行前检查各种方法上的注解。。根据不同注解实现不同事情
//如果有DS注解,实际在此处数据源就被切换
caller.test();// 这个方法被调用时 是代理执行的
//代理结束


caller.test中自己调用test1方法 实际上是没有走代理,所以没有任何机制检测到test1上的DS注解,这就导致数据源切换失败
解决办法就是另外写一个类来写test1,让caller去掉其他的类

其他相同的问题比如 @Asyn 异步注解无效

https://www.cnblogs.com/cfas/p/16110488.html

posted @ 2022-08-15 16:19  方东信  阅读(1797)  评论(0编辑  收藏  举报