【MyBatis】mybatis缓存机制

简介: 【MyBatis】mybatis缓存机制

1. 缓存基础知识:

  • 缓存: cache
  • 缓存的作用: 通过减少IO的方式, 来提高程序的执行效率
  • mybatis缓存包括:
  • 一级缓存: 讲话查询的数据存储到SqlSession中
  • 二级缓存: 将查询的数据存储到SqlSessionFactory中
  • 或者集成第三方的缓存: 比如EhCache...
  • mybatis缓存只针对DQL语句, 也就是说缓存机制只对应select语句.

2. 一级缓存:

  • 一级缓存默认是开启的, 不需要做任何配置
  • 原理: 只要使用同一个SqlSession对象执行同一条SQL语句, 就会走缓存
// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    // mapper1和mapper2的sqlsession都是相同的, 因此会走缓存
    CarMapper mapper1 = sqlSession.getMapper(CarMapper.class);
    Car car1 = mapper1.selectById(16L);
    // 会缓存
    CarMapper mapper2 = sqlSession.getMapper(CarMapper.class);
    Car car2 = mapper2.selectById(16L);
    sqlSession.close();
}
  • 什么时候不走缓存?
  • SqlSession对象不是同一个, 肯定不走缓存
  • 查询条件不一样, 肯定也不走缓存
  • 什么时候一级缓存失效?
  • 第一次DQL和第二次DQL之间做了以下任意一件, 都会让一级缓存清空
  • 执行了sqlSession的clearCache()方法, 这是手动清空缓存
  • 执行了INSERT/UPDATE/DELETE语句, 不管是操作哪张表的都会清空一级缓存

3. 二级缓存:

  • 二级缓存的范围是SqlSessionFactory
  • 使用二级缓存需要具备以下几个条件
  • 全局性的开启或关闭所有映射配置文件中已配置的任何缓存, 默认就是true, 无需设置
  • 在需要使用二级缓存的SqlMapper.xml文件中添加配置:
  • 使用二级缓存的实体类对象必须是可序列化的, 也就是必须实现java.io.Serializable接口
  • SqlSession对象关闭或提交之后, 一级缓存中的数据才会被写入到二级缓存当中, 此时二级缓存才可用.
// @test
public static void main(String[] args) {
    SqlSessionFactory sqlsessionfactory = new SqlSessionFactoryBuilder().
          build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession session1 = sqlsessionfactory.openSession();
    SqlSession session2 = sqlsessionfactory.openSession();
    CarMapper mapper1 = sqlSession1.getMapper(CarMapper.class);
    CarMapper mapper2 = sqlSession2.getMapper(CarMapper.class);
    // 这行代码执行结束之后, 实际上数据是缓存到一级缓存当中. (sqlSession1是一级缓存)
    Car car1 = mapper1.selectById(16L);
    System.out.println(car1);
    // 这里如果不关闭sqlSession1对象的话, 二级缓存中还是没有数据
    // 如果执行了这行代码, sqlSession1的一级缓存中的数据会放到二级缓存当中
    sqlSession1.close();
    // 这行代码执行结束之后, 实际上数据是缓存到一级缓存当中. (sqlSession2是一级缓存)
    Car car2 = mapper2.selectById(16L);
    System.out.println(car1);
    // 程序执行到这里的时候, 会将sqlSession1这个一级缓存中的数据写入到二级缓存当中
    sqlSession1.close();
    // 程序执行到这里的时候, 会将sqlSession2这个一级缓存中的数据写入到二级缓存当中
    sqlSession2.close();
}
  • 二级缓存的失效: 只需要俩次查询之间出现了增删改操作, 二级缓存就会失效(一级缓存也会失效)
相关文章
|
1天前
|
存储 缓存 前端开发
HTTP的缓存机制是什么?
HTTP的缓存机制是什么?
33 1
|
1天前
|
存储 缓存 运维
【Docker 专栏】Docker 镜像的分层存储与缓存机制
【5月更文挑战第8天】Docker 镜像采用分层存储,减少空间占用并提升构建效率。每个镜像由多个层组成,共享基础层(如 Ubuntu)和应用层。缓存机制加速构建和运行,通过检查已有层来避免重复操作。有效管理缓存,如清理无用缓存和控制大小,可优化性能。分层和缓存带来资源高效利用、快速构建和灵活管理,但也面临缓存失效和层管理挑战。理解这一机制对开发者和运维至关重要。
【Docker 专栏】Docker 镜像的分层存储与缓存机制
|
1天前
|
缓存 NoSQL Java
17:缓存机制-Java Spring
17:缓存机制-Java Spring
41 5
|
1天前
|
存储 缓存 自然语言处理
深入PHP内核:探索Opcode缓存机制
【5月更文挑战第1天】 在动态语言如PHP的执行过程中,每次脚本被请求时都需要经过一系列复杂的解析和编译步骤。为了优化这一过程并提高性能,PHP引入了Opcode缓存机制。本文将详细探讨Opcode的概念、作用以及它如何显著提升PHP应用的执行效率。我们将从缓存原理出发,分析几种常见的Opcode缓存工具,并通过实例说明如何在实际项目中实现和优化缓存策略。
|
1天前
|
缓存 NoSQL PHP
【PHP开发专栏】PHP缓存机制与实现
【4月更文挑战第29天】本文介绍了PHP缓存的基本概念、策略及实现方式。PHP缓存包括应用缓存、Web服务器缓存、数据库缓存和分布式缓存,常见策略有缓存预热、更新和懒加载。PHP的缓存实现包括文件缓存、APC、OPcache、Memcached和Redis。最佳实践包括缓存热点数据、控制粒度、设置失效策略、保证一致性和确保安全性。文中还提供了一个新闻列表和详情页的缓存实战示例,帮助开发者理解如何在实际项目中应用缓存。
|
1天前
|
缓存 流计算
缓存命中率和过期机制的一般思路
【4月更文挑战第20天】缓存命中率是评估缓存效果的关键,目标是达到90%以上,但某些频繁的小请求场景可能无法实现。过期机制可采用定时删除(精确但开销大)、延迟队列(精确但有队列开销)、懒惰删除(简单但时间不精确)或定期删除(简单但性能损耗不可控)。
19 4
|
1天前
|
缓存 Linux
linux系统缓存机制
linux系统缓存机制
|
1天前
|
缓存 数据库 开发者
Django视图中的缓存机制:提升页面加载速度
【4月更文挑战第15天】本文介绍了Django的缓存机制在提升页面加载速度中的作用。Django提供视图缓存和片段缓存,通过`cache_page`装饰器和`CacheMixin`实现视图级别的缓存,使用`{% cache %}`模板标签实现页面片段缓存。开发者可选择不同的缓存后端,并在设置中配置缓存参数。同时,注意合理控制缓存粒度、及时更新和管理缓存,以优化用户体验和网站性能。
|
1天前
|
XML 缓存 Java
MyBatis二级缓存解密:深入探究缓存机制与应用场景
MyBatis二级缓存解密:深入探究缓存机制与应用场景
76 2
MyBatis二级缓存解密:深入探究缓存机制与应用场景
|
1天前
|
存储 缓存 算法
深入探究LRU缓存机制:优化内存利用与提升性能
深入探究LRU缓存机制:优化内存利用与提升性能
220 1