Mybatis 二级缓存的使用
Mybatis二级缓存#
- 简介:二级缓存是namesace级别的,多个SqlSession去操作同个namespace下的Mapper的sql语句,多个SqlSession可以共用二级缓存,如果两个mapper的namespace相同,(既使是两个mapper,那么这两个mapper中执行sql查询的数据也将存在相同的二级缓存区域中,但是最后是每个Mapper单独的命名空间)
- 基于PerpetualCache的HashMap本地缓存,可自定义存储源,如Ehcacche/Redis等
- 默认是没有开启二级缓存
- 操作流程:第一次调用某个namespacce下的SQL去查询信息,查询到的信息会存放该mapper对应的二级缓存区域。第二次调用同个namespace下的mapper映射文件中,相同的sql去查询信息,会去对应的二级缓存内取结果
失效策略#
执行同个namespace下的mapper映射文件中增删改sql,并执行了commit操作,会清空该二级缓存
注意:实现二级缓存的时候,Mybatis建议返回的POJO是可序列化的,也就是建议实现Serializable接口
缓存淘汰策略:会使用默认的LRU算法来收回(最近最少使用的)
开启缓存#
如何开启某个二级缓存mapper.xml里面配置
<!--开启Mapper的namespace下的二级缓存--> <!-- eviction:代表的是缓存回收策略,常见下面两种 1)、LRU,最近最少使用的,移除最长时间不用的对象 2)、FIFO,先进先出,按对象进入缓存的顺序来移除他们 flushInterval:刷新间隔时间,单位为毫秒,这里配置的是10秒,如果不配置他,当SQL被执行的时候才会去刷新缓存 size:引入数目,代表缓存最多可以存储多少个对象,设置过大会导致内存溢出 readOnly:只读,缓存数据只能读取不能修改,默认值为false --> <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"></cache>
全局配置
<!--全局配置--> <settings> <!--这个配置使全局的映射器(二级缓存)启用或禁用缓存,全局总开关,这里关闭,mapper中开启了也没用--> <setting name="cacheEnabled" value="true"/> </settings>
一级缓存和二级缓存使用顺序#
优先查询二级缓存==》查询一级缓存==》数据库
控制某个方法不走二级缓存#
在标签中添加 useCache="false"
<select id="queryUserOrder" resultMap="UserOrderResultMap" useCache="false"> select u.id, u.name, u.pwd, u.phone, u.head_img, v.id idv, v.out_trade_no, v.create_time, v.state, v.total_fee, v.video_id, v.video_title, v.video_img from user u left join video_order v on u.id = v.user_id </select>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2019-07-13 .Net高级编程-自定义错误页 web.config中<customErrors>节点配置
2019-07-13 .Net网站防盗链
2019-07-13 .Net捕获网站异常信息记录操作日志