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.数据存储较大,查询耗时较长

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

总结

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

相关文章

  • Spring 异步接口返回结果的四种方式

    Spring 异步接口返回结果的四种方式

    这篇文章主要介绍了Spring 异步接口返回结果的四种方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • java GUI界面初步入门示例【AWT包】

    java GUI界面初步入门示例【AWT包】

    这篇文章主要介绍了java GUI界面,结合简单实例形式分析了java使用AWT包进行图形界面操作相关使用技巧,需要的朋友可以参考下
    2020-01-01
  • 图解如何在Spring Boot中使用JSP页面

    图解如何在Spring Boot中使用JSP页面

    这篇文章主要介绍了图解如何在Spring Boot中使用JSP页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • MyBatis动态SQL中的trim标签的使用方法

    MyBatis动态SQL中的trim标签的使用方法

    这篇文章主要介绍了MyBatis动态SQL中的trim标签的使用方法,需要的朋友可以参考下
    2017-05-05
  • 一文弄懂fastjson

    一文弄懂fastjson

    fastjson 是一个java语言编写的高性能且功能完善的JSON库,本文主要介绍了fastjson的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • 解决SpringBoot打成jar运行后无法读取resources里的文件问题

    解决SpringBoot打成jar运行后无法读取resources里的文件问题

    这篇文章主要介绍了解决SpringBoot打成jar运行后无法读取resources里的文件问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • java实现线性表及其算法

    java实现线性表及其算法

    线性表是最简单和最常用的一种数据结构,它是有n个体数据元素(节点)组成的有限序列,这篇文章主要介绍了java实现线性表及其算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Java重写equals及hashcode方法流程解析

    Java重写equals及hashcode方法流程解析

    这篇文章主要介绍了Java重写equals及hashcode方法流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java并发系列之AbstractQueuedSynchronizer源码分析(条件队列)

    Java并发系列之AbstractQueuedSynchronizer源码分析(条件队列)

    这篇文章主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java程序员必备的11大IntelliJ插件(附地址)

    Java程序员必备的11大IntelliJ插件(附地址)

    这篇文章主要介绍了Java程序员必备的11大IntelliJ插件(附地址),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论