| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring整合MyBatis为什么导致MyBatis一级缓存失效 -> 正文阅读 |
|
[Java知识库]Spring整合MyBatis为什么导致MyBatis一级缓存失效 |
文章目录如题,Spring整合MyBatis为什么导致MyBatis的一级缓存失效? 一、搭建失效场景
1、对应的mapper接口及对应的SQL语句(返回一个mobian的字符串) 1、使用MyBatis查询同一条SQL1)直接调用编写好的工具类,开启对应的连接,执行三条一模一样的查询 2)查看对应的测试结果 熟悉MyBatis的小伙伴都知道MyBatis默认开启一级缓存,当我们执行一条查询语句之后,MyBatis会以我们查询的信息生成一个缓存key,查询的结果为value,存到一个map中,即存入一级缓存,下面是具体的源码,感兴趣可以看看。
3)关闭一级缓存后再次测试
测试结果:
2、使用Spring整合MyBatis查询同一条SQL1)同样查询三次SQL,直接访问对应的路径即可完成测试 2)查看对应的测试结果 我们在测试Spring整合MyBatis的用例时,MyBatis的一级缓存使用默认值,即开启一级缓存,但是我们的测试结果却表明,MyBatis的一级缓存好像没起作用。这也就时本文的重点——Spring整合MyBatis后一级缓存失效 3)添加@Transactional注解
二、原理分析(重点)
1、明白的其它知识点本文关于MyBatis中Mapper接口与Spring中Bean相互整合的部分就不再过多重复,感兴趣的可以查看我之前的写的博客。 @Autwired自动注入XxxMapper接口原理(含mybstis-spring.jar源码) 最终得到的结论就是,Spring中使用@Autwired注解,注入xxMapper接口的时候,实际上是注册的是一个代理对象MapperFactoryBean(Spring的Bean是会默认忽略接口的,所以对应的扫描成为BD的逻辑也就是靠mybatis-spring来完成),注册了多少个mapper接口,就会生成多少个MapperFactoryBean代理对象,只是每个代理对象的mapperInterface不同罢了。 想要明白为什么可以通过该方式实现调用不同类型的Mapper代理出来的Bean的原理,需要你了解访问实现了FactoryBean接口的Bean的访问流程,巧了,你又有地方可以参考了: 2、调用入口是接口中getObject方法
3、为什么加了@Transactional注解就可以使用缓存
我认为,在MyBatis中使用sqlSession对象进行数据查询时,当遇到并发量比较大的一些情况时,就有可能出现线程不安全的情况,换句话说就是事务之间的隔离性没有做好。 该类是Spring中的事务同步管理器类,synchronizations集合用于存放每一个线程的事务同步器,即存放一个线程的所有事务,使用ThreadLocal类型来存储,可以保证不同线程之间的数据安全性。 4、再总结如果我们没有添加@Transactional注解,Spring认为我的每一次查询都都是相互独立的,便开启了三次不同的事务也即是创建了三个不同的sqlSession对象。即无法使用到MyBatis的一级缓存。 如果我们添加了@Transactional注解,Spring在执行了第一次查询后,会将当前线程的事务情况存储到synchronizations 的集合中,当第二次再执行查询的时候,能够在缓存中直接获取到当前的事务情况(包含sqlSession对象),即不会再去调用openSession方法,继而创建一个新的sqlSession对象,而是使用缓存中的sqlSession对象(对应的代码在上面的第五步)。这就保证了在添加@Transactional注解的情况下,能够走MyBatis的一级缓存 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 18:31:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |