本文主要介绍了浅谈Mybatis二级缓存的缺陷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一级缓存默认是开启的(但是整合了Spring,Mybatis的一级缓存默认就失效了)
二级缓存是要手动配置开启的(二级缓存是mapper级别的缓存,可以跨SqlSession)
Mybatis二级缓存
开启二级缓存(xml方式):在*Mapper.xml中加入如下代码
<!--eviction: 清空缓存的策略
readOnly: 是否只读
flushInterval: 每个60秒刷新一次缓存
size: 内存大小,最多存储结果对象或者列表的512个引用 -->
<cache readOnly="true" eviction="FIFO" flushInterval="60000" size="512"/>
缓存清除策略
- LRU – 最近最少使用:移除最长时间不被使用的对象。
- FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
- SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
- WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
两种方式二选一,如果都配置会报错:Caches collection already contains value for com.lixianhe.dao.UserMapper
注意:使用Mybatis二级缓存必须是xml写SQL语句,不能使用注解写SQL语句
缓存的执行顺序
- 先从二级缓存中查询,二级缓存没有进入SqlSession中查询
- SqlSession没有就去数据库查询,然后存到一级缓存中,查询完关闭SqlSession
- 一级缓存再提交给二级缓存
在开启二级缓存的情况下执行一条sql
select colA1, colA2, colB1, colB2
from A, B
where ...
A表执行了上述的sql
B表更新了字段cloB1,colB2
A表再次执行了上述的sql(前提没有执行insert、update、delete)
A表第二次就查询出了脏数据(B表的数据就是脏数据),这个问题对二级缓存来说是一个无解的问题
因此Mybatis二级缓存的使用用一个前提,必须保证所有的增删改查都在同一个namespace下才行
由于二级缓存的弊端,所以并不建议在实际生产中使用,而是在外部实现自己的缓存,如使用Redis做缓存
到此这篇关于浅谈Mybatis二级缓存的缺陷的文章就介绍到这了,更多相关Mybatis二级缓存内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:浅谈Mybatis二级缓存的缺陷


- Springboot整合minio实现文件服务的教程详解 2022-12-03
- Java中的日期时间处理及格式化处理 2023-04-18
- Spring Security权限想要细化到按钮实现示例 2023-03-07
- Java实现顺序表的操作详解 2023-05-19
- JSP页面间传值问题实例简析 2023-08-03
- SpringBoot使用thymeleaf实现一个前端表格方法详解 2023-06-06
- ExecutorService Callable Future多线程返回结果原理解析 2023-06-01
- 基于Java Agent的premain方式实现方法耗时监控问题 2023-06-17
- 深入了解Spring的事务传播机制 2023-06-02
- JSP 制作验证码的实例详解 2023-07-30