MyBatis之一级缓存和二级缓存问题

 更新时间:2024年01月30日 10:05:48   作者:源末coco  
这篇文章主要介绍了MyBatis之一级缓存和二级缓存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MyBatis缓存介绍

MyBatis 是一款优秀的持久层框架,它提供了缓存功能来减少数据查询时的数据库交互次数,从而提高查询性能。

MyBatis 的缓存分为一级缓存和二级缓存两种类型。

缓存分类

  • 根据缓存存放位置,缓存可以分为本地缓存和分布式缓存。
  • 根据缓存作用范围,缓存可以分为永久缓存和临时缓存。

在 MyBatis 中,根据作用范围,分别有一级缓存和二级缓存两种类型。

一级缓存与二级缓存的区别

1.作用范围

  • 一级缓存的作用范围是 SqlSession 的生命周期
  • 二级缓存的作用范围是整个应用程序的生命周期

2.实现方式

  • 一级缓存是通过 SqlSession 内置的一个 HashMap 来实现的
  • 而二级缓存则是通过配置 Cache 接口来实现的

3.共享机制

  • 一级缓存只能在同一个 SqlSession 内部共享
  • 二级缓存可以在多个 SqlSession 之间共享

4.缓存规则

  • 一级缓存默认开启并且无法关闭;
  • 二级缓存需要手动开启并进行配置

MyBatis缓存原理

MyBatis 的缓存本质上是一个 HashMap,它的键是查询语句和参数的组合,值是查询结果。

当我们执行一个查询时,MyBatis 会先从缓存中查找对应的查询结果,如果缓存中存在,则直接返回缓存的结果;如果缓存中不存在,则从数据库中查询数据,并将查询结果存入缓存中。

每个 SqlSession 都有自己的缓存,因此在不同的 SqlSession 中执行同一个查询语句,它们所使用的缓存是不同的。

同时,MyBatis 的缓存是基于引用计数的机制实现的,当查询语句被多次引用时,缓存的引用计数会加 1,只有当引用计数为 0 时,缓存才会被真正的清除。

使用缓存

1.一级缓存的使用

在同一个 SqlSession 中,同样的 SQL 查询只会执行一次,并把查询结果缓存到 SqlSession 内置的 HashMap 中。

下面是示例代码:

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user1 = userMapper.selectUserById(1);
User user2 = userMapper.selectUserById(1);
System.out.println(user1 == user2); // true
sqlSession.close();

2.二级缓存的使用

需要在 XML 映射文件中添加 <cache> 标签来开启二级缓存,并指定缓存实现类。

下面是示例代码:

  • <cache/>

需要注意的是,如果要使用二级缓存,需要让你的实体类实现 Serializable 接口。

缓存的使用场景

缓存的使用场景主要包括以下两种情况:

1.某些数据被经常访问

  • 如果某些数据经常被访问,
  • 那么将这些数据缓存起来,
  • 可以减少数据库交互次数,提高系统性能。

2.数据存储较大,查询耗时较长

  • 如果某些数据存储较大,且查询这些数据的效率比较低
  • 那么可以将查询结果缓存下来,
  • 下次需要查询时,直接从缓存中读取。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Web过滤器的核心原理、实现与执行顺序配置方法(最新整理)

    Java Web过滤器的核心原理、实现与执行顺序配置方法(最新整理)

    本文介绍了JavaWeb过滤器的核心概念、实现方式及执行顺序,过滤器允许在请求到达Servlet之前或响应返回客户端之前对请求和响应进行处理,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java中@Autowired注解用法及说明

    Java中@Autowired注解用法及说明

    @Autowired是Spring框架中的一个核心注解,用于实现依赖注入,它允许Spring容器自动装配依赖,从而解耦代码、提高可测试性和可维护性,该注解可以用于字段、构造器和Setter方法上,并且可以结合@Qualifier注解解决依赖冲突,理解@Autowired`的使用对于掌握Spring开发至关重要
    2025-11-11
  • SpringBoot使用@Async注解实现异步调用

    SpringBoot使用@Async注解实现异步调用

    这篇文章主要介绍了SpringBoot使用@Async注解实现异步调用,异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待,程序执行完即可执行,可以减少程序执行时间,需要的朋友可以参考下
    2023-10-10
  • Java中如何模拟HTTP请求并验证功能

    Java中如何模拟HTTP请求并验证功能

    要模拟HTTP请求并验证功能,你可以使用Spring Boot提供的MockMvc工具,它允许我们在没有实际启动HTTP服务器的情况下测试Spring MVC控制器,下面给大家分享如何模拟HTTP请求并验证功能,感兴趣的朋友一起看看吧
    2024-05-05
  • java读取json文件的2种方式例子

    java读取json文件的2种方式例子

    这篇文章主要给大家介绍了关于java读取json文件的2种方式,在开发过程中有时会遇到需要读取.json文件的需求,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Java 中的语法糖,真甜

    Java 中的语法糖,真甜

    语法糖(Syntactic sugar),也叫做糖衣语法,是英国科学家发明的一个术语,通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会.这篇文章主要介绍了Java 中的语法糖知识,需要的朋友可以参考下
    2020-12-12
  • Java中ArrayList同步的2种方法分享

    Java中ArrayList同步的2种方法分享

    这篇文章主要分享了Java中ArrayList同步的2种方法,Collections.synchronizedList()的方法,这个方法要进行串行访问以及使用CopyOnWriteArrayList,下面分享内容需要的小伙伴可以参考一下
    2022-03-03
  • java获取当前时间的四种方法代码实例

    java获取当前时间的四种方法代码实例

    这篇文章主要介绍了java获取当前时间的四种方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java Swing实现QQ登录页面

    Java Swing实现QQ登录页面

    这篇文章主要为大家详细介绍了Java Swing实现QQ登录页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java解析使用JSON的多种方法

    Java解析使用JSON的多种方法

    使用JSON作为数据传输,在浏览器端非常方便。JSON去除了所有JavaScript执行代码,只保留对象格式,而且JSON天生适合JavaScript处理,所以,绝大多数REST API都选择JSON作为数据传输格式。现在问题来了:使用Java如何对JSON进行读写?
    2022-12-12

最新评论