MyBatis中的缓存

一级缓存
一级缓存默认会启用,想要关闭一级缓存可以在 select 标签上配置 flushCache=“true”;一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询时, MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map 对象中。如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map 缓存对象中己经存在该键值时,则会返回缓存中的对象;任何的 INSERT 、UPDATE 、DELETE 操作都会清空一级缓存;

二级缓存
二级缓存也叫应用缓存,存在于 SqlSessionFactory 的生命周期中,可以理解为跨 sqlSession;
缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响。在 MyBatis 的核心配置文件中 cacheEnabled 参数是二级缓存的全局开关,默认值是 true,如果把这个参数设置为false,即使有后面的二级缓存配置,也不会生效;要开启二级缓存,你需要在你的 SQL Mapper 文件中添加配置:

这段配置的效果如下: 映射语句文件中的所有 select 语句将会被缓存。 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。 缓存会存储列表集合或对象(无论查询方法返回什么)的 512 个引用。 缓存会被视为是 read/write(可读/可写)的缓存;

缓存调用注意事项:

  1. 每次与数据库的连接都会优先从缓存中获取数据
  2. 先查二级缓存,再查一级缓存
  3. 二级缓存以 namespace 为单位的,是可以由SqlSession 共享的,容易出现脏读,建议避免使用二级缓存。多个namespace是可以通过标签来指定namespace属性实现共享同一个namespace的二级缓存。
  4. 一级缓存是 SqlSession 独享的,建议开启
posted @   vello  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示