欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析

发布时间:2025/6/17 编程问答 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

    原本想用springboot+mybatis做多数据源的切换方案,想通过借鉴网上现有的方案,结果搜索后大量都是使用AbstractRoutingDataSource多数据源方案,通过实践后,发现如果声明了事务,将会在事务内部切换数据源失败。结果,就是debug,看源码找原因。下面是springboot+mybatis的调用栈,如果有点功力的同学们一看就知道了。

存在transaction情况下@Transactional切面切入拦截 DataSourceTransactionManagerdoBegin从threadlocal holder中获取connection获取不到获取连接AbstractRoutingDataSource#getConnection封装holder,存入threadLocal中,key为AbstractRoutingDataSource 获取到,不再AbstractRoutingDataSource#getConnection此时,已经获取到connection,如果@Transactional注解还有切换数据源的切面,则使用切面中切换好的数据源,如果没有其他注解,则获得配置的defaultDataSource的数据源。======================= step2 =============================== 之后,调用mybatis的mappermybatisExecutorprepareStatementgetConnection()SpringManagedTransactiongetConnection() 查看threadLocal中,key为AbstractRoutingDataSource,取出connection的holder如果有用holder里面的connection如果没有从AbstractRoutingDataSource获取新的连接======================= step3 ==================================== @Transactional注解的方法中还在调用其他需要切换数据源的service或者方法仍然走step2,由于从threadLocal可以获取到connection,所以不会从AbstractRoutingDataSource获取新的连接,也就是切换数据源失败

    这里的AbstractRoutingDataSource#getConnection方法是切换数据源的关键。如果在事务过程中,我们mybatis每次都是获取threadlocal中key为AbstractRoutingDataSource的connection,则不会再调用AbstractRoutingDataSource中的getConnection方法切换数据源。

    如果想解决这个问题,自定义吧。。。

 

转载于:https://my.oschina.net/thinwonton/blog/2962391

总结

以上是生活随笔为你收集整理的springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。