首页 > 其他分享 >mybatis一级缓存、二级缓存的原理

mybatis一级缓存、二级缓存的原理

时间:2024-06-30 18:22:55浏览次数:15  
标签:存储 缓存 一级 SqlSession 二级缓存 SQL mybatis

MyBatis 的缓存机制分为两个级别:一级缓存和二级缓存。这两种缓存机制都有助于提高数据访问效率,减少对数据库的直接请求次数,但它们的工作原理和适用场景有所不同。

一级缓存(Per-Executor Transactional Caches)

一级缓存也被称为“事务范围内的缓存”或者“执行器级别的缓存”。它是默认开启的,并且不需要任何额外配置。一级缓存的作用范围是在同一个 SqlSession 对象内,也就是说,在同一个 SqlSession 中执行的多个 SQL 查询可以共享缓存中的结果。

一级缓存的原理:

  1. 缓存存储位置:一级缓存存储在 SqlSession 实例中,每个 SqlSession 都有自己的缓存。

  2. 缓存策略:当第一次执行 SQL 查询时,查询结果会被存储在一级缓存中。后续如果执行相同的 SQL 查询,MyBatis 将首先检查一级缓存中是否存在相同的结果,如果存在,则直接从缓存中获取,避免了对数据库的再次访问。

  3. 缓存刷新:一级缓存会在以下几种情况下被清空或重置:

    • 当提交或回滚事务时。
    • 当执行任何更新操作(如 insert、update 或 delete)时。
    • 当关闭 SqlSession 时。

二级缓存(Application-wide Caches)

二级缓存也被称为“应用级别的缓存”,它的作用范围比一级缓存更广,可以在整个应用程序中共享。二级缓存允许在多个 SqlSession 实例之间共享缓存数据,这通常通过在映射文件中配置 <cache> 元素来启用。

二级缓存的原理:

  1. 缓存存储位置:二级缓存存储在映射器(Mapper)级别,即在每个命名空间(namespace)内维护一个缓存实例。

  2. 缓存策略:与一级缓存类似,二级缓存也会在首次执行 SQL 查询后存储结果。但是,二级缓存的数据可以在不同的 SqlSession 之间共享,只要这些 SqlSession 使用的是同一个 Mapper。

  3. 缓存刷新:二级缓存的刷新机制比一级缓存复杂。默认情况下,当执行更新操作时,相关的二级缓存会被清空。但是,可以通过配置二级缓存的 eviction 策略、flushInterval、readOnly 属性等来定制缓存行为。

  4. 配置:二级缓存需要在映射文件中显式地配置,可以设置缓存过期时间、缓存刷新间隔、缓存实现类等属性。

  5. 注意事项:为了保证数据的一致性和正确性,当使用二级缓存时,建议将实体类设计为不可变对象或者在更新数据后主动清空相关缓存。

总的来说,一级缓存和二级缓存分别在不同的层次提供了数据缓存功能,一级缓存侧重于单个会话内的性能优化,而二级缓存则着眼于整个应用层面的数据共享和性能提升。合理利用这两级缓存,可以显著提高基于 MyBatis 的应用程序的性能和响应速度。

标签:存储,缓存,一级,SqlSession,二级缓存,SQL,mybatis
From: https://www.cnblogs.com/use-D/p/18276743

相关文章

  • MyBatis针对String类型的数字<if>标签失效问题
    需求描述:大致场景是订单模块去接受流程模块发送的MQ消息,针对MQ消息发送的是一个实体类,该实体类中有一个String类型的字段,用于判断当前业务状态,1表示审核中2表示已审核等。订单模块根据这个状态去修改自身状态的信息可以看到这里有一个If标签,用于判断这个eventType的值......
  • Spring框架集成Mybatis
    本例演示转账操作准备数据库表t_act(账户表)创建maven模块,引入依赖<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.1.8</......
  • Mybatis 系列全解(1)——全网免费最细最全,手把手教,学完就可做项目!
    Mybatis系列全解(1)1.第一个小程序2.CURD增删改查3.模糊查询4.配置解析4.1核心配置文件4.2环境配置4.3属性4.4类型别名4.5设置4.6映射器mappers1.第一个小程序1)创建一个数据库,一个表,填入一些数据。(这里不做演示,可以参考我前面写的数据库文章有具体介绍:......
  • springboot+vue+mybatis流浪宠物领养管理系统+PPT+论文+讲解+售后
    互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对宠物领养信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用宠物领养系统可以有效管理,使信息管理能够......
  • MyBatis 源码分析--获取SqlSession
    前言:前文我们从源码层面梳理了SqlSessionFactory的创建过程,本篇我们继续分析一下SqlSession的获取过程。初识MyBatis【MyBatis核心概念】MyBatis源码分析–SqlSessionFactory案例代码:publicclassMyBatisTest{@Testpublicvoidtest()throwsIOEx......
  • 基于Spring Boot的MyBatis整合示例:构建简单的用户管理系统
    目录1.创建一个新的SpringBoot项目2.添加必要的依赖3.配置数据库连接4.创建实体类5.创建Mapper接口6.创建MapperXML文件7.创建Service类8.创建Controller类9.启动应用程序10.测试在当今的软件开发中,SpringBoot和MyBatis作为两个流行的Java框架,常常被......
  • Mybatis-Plus分页插件,嵌套查询和嵌套结果映射
    Mybatis-Plus分页插件注意事项使用Mybatis-Plus的分页插件进行分页查询时,如果结果需要使用<collection>进行映射,只能使用嵌套查询(NestedSelectforCollection),而不能使用嵌套结果映射(NestedResultsforCollection)。嵌套查询和嵌套结果映射是Collection映射的两种方式,下面通过......
  • 解决Ajax请求浏览器缓存问题的几种方法
    在进行Ajax数据请求时,有时会遇到浏览器缓存响应结果的问题,导致无法获取到最新数据。本文介绍几种解决方法,帮助你确保每次请求都能获得最新的数据。1.添加随机数或时间戳一种简单而有效的方法是在请求URL中添加随机数或时间戳,以确保每次请求的URL都是唯一的,从而避免浏览器缓......
  • 9. Mybatis 小技巧
    1.#{}和$#{}和${}的区别#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。‍什么情况......
  • 9. Mybatis 小技巧
    1.#{}和${}和${}的区别{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。${}:先进行sql语句拼接,然后再编译sql语句,底层是Statement实现。存在sql注入现象。只有在需要进行sql语句关键字拼接的情况下才会用到。‍什么情况下......