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多数据源方案的分析相关推荐

  1. SpringBoot源码笔记分析

    SpringBoot源码笔记分析 1.基础 1.配置SpringBoot热部署 1.引入依赖 <dependency><groupId>org.springframework. ...

  2. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  3. Springboot源码分析第一弹 - 自动装配实现

    Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...

  4. SpringBoot源码分析之内置Servlet容器

    原文链接:http://fangjian0423.github.io/2017/05/22/springboot-embedded-servlet-container/ SpringBoot内置了Se ...

  5. springboot源码分析

    快速开发底层原理 SpringBoot核心理念 能够实现帮助开发者快速的整合第三方框架(Spring.Mybatis.hibernate) 原理:Maven依赖封装整合和自定义starter. 完全去 ...

  6. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(中)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.调用后处理器 2.1.调用在上下文中注册为beanFactory的后置处理器 2.2.invokeBeanFactoryPostP ...

  7. Alian解读SpringBoot 2.6.0 源码(七):启动流程分析之准备应用上下文

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.准备应用上下文 2.1.整体流程 2.2.设置环境 2.3.应用上下文进行后置处理 2.4.应用所有初始化器 2.5.发布应用上下 ...

  8. Alian解读SpringBoot 2.6.0 源码(六):启动流程分析之创建应用上下文

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.创建应用上下文 2.1.初始化入口 2.2.初始化AbstractApplicationContext 2.3.初始化Generi ...

  9. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(下)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.初始化特定上下文子类中的其他特殊bean 2.1.初始化主体资源 2.2.创建web服务 三.检查监听器bean并注册它们 四.实 ...

最新文章

  1. 鸿蒙os系统被推送,鸿蒙来了!华为大规模推送鸿蒙OS系统,造成网站一度瘫痪...
  2. SpringCloud Ribbon(四)之全局配置与服务配置
  3. python代码编程软件_编程与编程软件(python-pycharm)
  4. Java学习进阶—高级编程
  5. aptana 代码折行
  6. 利用计算机模拟专家给病人,《计算机应用基础2007》复习资料
  7. SQL案例学习-员工考勤记录
  8. 三维全息显微镜成生物成像领域“新宠”
  9. exe msdt 无法上网_msdt.exe文件下载
  10. 我只会SQL,到底能不能找到工作?
  11. 如何在ps中添加图片上的塑料布效果
  12. mac dreamveaver cc破解方法
  13. MVCC及其原理详解
  14. Alpha通道原理及实现方法
  15. nand flash多少次写_这个比QQ空间还古老的网站,是多少女孩的精神家园?
  16. Python基础-DAY16
  17. 2020年苹果开发者资质验证流程以及失败后提示未能验证证件
  18. 谷歌 zx 脚手架模块中文文档
  19. oZone3D FurMark(甜甜圈furmark显卡压力测试软件)绿色单文件版V1.9.2 | 电脑烤机测试软件
  20. 95后字节八年测开晒出工资单:狠补了这个,真香···

热门文章

  1. C#异步编程的实现方式(1)——异步委托
  2. Ghost后只有一个C盘解决方法(转)
  3. live的domain服务
  4. hadoop 配置项的调优
  5. struts+hibernate 分页
  6. Docker Swarm mode与滚动升级
  7. hdu2482 字典树+spfa
  8. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | InMemoryDexClassLoader 类加载器脱壳点总结 )
  9. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
  10. 【Windows 逆向】OD 调试器工具 ( CE 工具通过查找访问的方式找到子弹数据基地址 | 使用 OD 工具附加游戏进程 | 在 OD 工具中查看子弹数据地址 | 推荐 )