Mybatis(四)—— Mybatis 缓存

Stella981
• 阅读 807

一、Mybatis 缓存

MyBatis 包含一个非常强大的查询缓存特性,使用缓存可以使应用更快地获取数据,避免频繁的数据库交互

二、Mybatis缓存分类

  1. 一级缓存:SqlSession的缓存

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

    • 二级缓存存在于 SqlSessionFactory 的生命周期中,可以理解为跨sqlSession;缓存是以namespace为单位的,不同namespace下的操作互不影响。

    • setting参数 cacheEnabled,这个参数是二级缓存的全局开关,默认值是 true,如果把这个参数设置为 false,即使有后面的二级缓存配置,也不会生效;

    • 要开启二级缓存,你需要在你的 SQL 映射文件中添加配置:

    • 字面上看就是这样。这个简单语句的效果如下:

      • 映射语句文件中的所有 select 语句将会被缓存。
      • 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
      • 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
      • 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
      • 缓存会存储列表集合或对象(无论查询方法返回什么)的 512个引用。
      • 缓存会被视为是 read/write(可读/可写)的缓存;
    • Tips: 使用二级缓存容易出现脏读,建议避免使用二级缓存,在业务层使用可控制的缓存代替更好;

  3. 缓存使用示意图

    Mybatis(四)—— Mybatis 缓存

  4. 缓存案例

    Mybatis(四)—— Mybatis 缓存

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mybatis整合redies,使用redis作为二级缓存
方法一(一)、RedisCache(mybatis二级缓存实现类)/Createdbyhhjianon17627./publicclassRedisCacheimplementsCache{
Wesley13 Wesley13
3年前
Java框架之Mybatis(二)
本文主要介绍Mybatis(一)之后剩下的内容:1mybatis中log4j的配置2dao层的开发(使用mapper代理的方式)3mybatis的配置详解4输入输出映射对应的类型(parameterType和resultType)5mybatis动态sql6mybatis中的一级缓存7mybat
Wesley13 Wesley13
3年前
J2Cache 没有 Redis 也可以实现多节点的缓存同步
J2Cache是一个两级的缓存框架,第一级是基于内存的数据缓存,支持caffeine、ehcache2和ehcache3,二级缓存只支持redis。在某些生产环境中你可能没有redis,但是又希望多个应用节点间的缓存数据是同步的。配置的方法很简单:1\.首先关闭二级缓存(使用none替代redis)j2cache
Stella981 Stella981
3年前
Mybatis一二级缓存实现原理与使用指南
Mybatis与Hibernate一样,支持一二级缓存。一级缓存指的是Session级别的缓存,即在一个会话中多次执行同一条SQL语句并且参数相同,则后面的查询将不会发送到数据库,直接从Session缓存中获取。二级缓存,指的是SessionFactory级别的缓存,即不同的会话可以共享。缓存,通常涉及到缓存的写、读、过期(更新缓存
Stella981 Stella981
3年前
Mybatis深入源码分析之SqlSessionFactory二级缓存原理分析
!(https://www.w3cschool.cn/attachments/image/20170807/1502093784622523.png)上篇内容回顾可以参考;Mybatis深入源码分析之SQLSession一级缓存原理分析(https://my.oschina.net/u/3995125/blog/3079788)这里再概括下上
Stella981 Stella981
3年前
Hibernate(四)——缓存策略+lazy
Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率wenti,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两种缓存,合理的使用缓存策略可以大大提高我们的操作数据效率,但是利用不能,可能会造成不必要的麻烦。一,一级缓存(Session缓