当前位置: 首页 > 编程笔记 >

Mybatis 缓存原理及失效情况解析

赖翰
2023-03-14
本文向大家介绍Mybatis 缓存原理及失效情况解析,包括了Mybatis 缓存原理及失效情况解析的使用技巧和注意事项,需要的朋友参考一下

这篇文章主要介绍了Mybatis 缓存原理及失效情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、什么是缓存[Cache]

  • 存在内存中的临时数据。
  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

2、为什么要使用缓存

减少和数据库的交互次数,减少系统开销,提高系统效率。

3、什么样的数据需要使用缓存

经常查询且不易改变的数据

4、Mybatis缓存

  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
  • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
    • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

5、一级缓存

一级缓存也叫本地缓存:

  • 与数据库同一次会话期间查询到的数据会放在本地缓存中。
  • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;

6、一级缓存失效的四种情况

  • sqlSession不同
  • sqlSession相同,查询条件不同
  • sqlSession相同,两次查询之间执行了增删改操作!
  • sqlSession相同,手动清除一级缓存
@Test
public void testQueryUserById(){
  SqlSession session = MybatisUtils.getSession();
  UserMapper mapper = session.getMapper(UserMapper.class);
  User user = mapper.queryUserById(1);
  System.out.println(user);
  session.clearCache();//手动清除缓存
  User user2 = mapper.queryUserById(1);
  System.out.println(user2);
  System.out.println(user==user2);
  session.close();
}

所以说,一级缓存就是一个map

7、二级缓存

  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
  • 工作机制
    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
    • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
    • 新的会话查询信息,就可以从二级缓存中获取内容;
    • 不同的mapper查出的数据会放在自己对应的缓存(map)中;

使用步骤:

核心配置文件

<setting name="cacheEnabled" value="true"/>

去每个mapper.xml中配置使用二级缓存,这个配置非常简单;

方式一:

<cache/>

方式二:

<cache
 eviction="FIFO"
 flushInterval="60000"
 size="512"
 readOnly="true"/>

这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

8、结论

只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据

查出的数据都会被默认先放在一级缓存中

只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中

原理图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍MyBatis缓存功能原理及实例解析,包括了MyBatis缓存功能原理及实例解析的使用技巧和注意事项,需要的朋友参考一下 缓存 1、简介 查询 : 连接数据库,耗资源! 一次查询的结果,给他暂存在一个可以直接取到的地方!--->内存 : 缓存 我们再次查询相同数据的时候,直接走缓存,就不用走数据库了 什么是缓存: 存在内存中的临时数据 将用户经常查询的数据放在缓存(内存)中,用户去查

  • 本文向大家介绍MyBatis缓存实现原理及代码实例解析,包括了MyBatis缓存实现原理及代码实例解析的使用技巧和注意事项,需要的朋友参考一下 一、一级缓存(本地缓存)   sqlSession级别的缓存。一级缓存是一直开启的;SqlSession级别的一个Map与数据库同一次会话期间查询到的数据会放在本地缓存中。以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库;   一级缓存失效

  • 本文向大家介绍深入理解Mybatis二级缓存,包括了深入理解Mybatis二级缓存的使用技巧和注意事项,需要的朋友参考一下 上篇文章给大家介绍了mybatis一级缓存,有需要的朋友可以参考下。 与一级缓存相比,二级缓存范围更大了一些,可以被多个SqlSession所共用。 同样是发送同样的查询sql会先去缓存中找,找不到再去查询数据库。 每个namespace的mapper都会有自己的一个缓存的空

  • 本文向大家介绍深入理解Mybatis一级缓存,包括了深入理解Mybatis一级缓存的使用技巧和注意事项,需要的朋友参考一下 客户端向数据库服务器发送同样的sql查询语句,如果每次都去访问数据库,会导致性能的降低。 那么怎么提高呢? mybatis为我们提供了一级缓存的策略 在一个sqlSession开启和关闭之间,sqlSession对象内部(其实是Executor)会维护一个缓存的对象,当查询数

  • 本文向大家介绍JVM代码缓存区CodeCache原理及用法解析,包括了JVM代码缓存区CodeCache原理及用法解析的使用技巧和注意事项,需要的朋友参考一下 一. CodeCache简介 从字面意思理解就是代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(native code)。当然JNI(Java本地接口)的机器码也放

  • 本文向大家介绍Python代码块及缓存机制原理详解,包括了Python代码块及缓存机制原理详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python代码块及缓存机制原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.相同的字符串在Python中地址相同 2.代码块: 所有的代码都需要依赖代码块执行。 ​ 一个模块,一个函