一级缓存与二级缓存

1.一级缓存

一级缓存基于sqlSession默认开启,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。

一级缓存原理

一级缓存与二级缓存

一级缓存的作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

需要注意的是,如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。
当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了。
关闭一级缓存后,再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常。

2. 二级缓存
二级缓存是mapper级别的缓存。使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存的作用域是mapper的同一个namespace。不同的sqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。

二级缓存原理

在MyBatis配置文件(mybatis-config.xml)中开启二级缓存

一级缓存与二级缓存
//value属性默认为false
在**Mapper.xml中开启当前mapper的namespace下的二级缓存

实现序列化

由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,所以需要给缓存的对象执行序列化。

如果该类存在父类,那么父类也要实现序列化。

禁用二级缓存

该statement中设置userCache=false可以禁用当前select语句的二级缓存,即每次查询都是去数据库中查询,默认情况下是true,即该statement使用二级缓存。

Original: https://www.cnblogs.com/daimenglaoshi/p/16706249.html
Author: 呆萌老师
Title: 一级缓存与二级缓存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608830/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关系数据库元数据处理类(一) 创建元数据实体

    1 /// 2 /// 数据库 3 /// 4 public class Database 5 { 6 public string Name { get; set; } 7 } 1…

    Java 2023年6月5日
    071
  • AUSTOj2

    include for(int i=0;i Original: https://www.cnblogs.com/liujy2233/p/16746441.htmlAuthor: 平…

    Java 2023年6月15日
    071
  • 妙用 Intellij IDEA 创建临时文件,Git 跟踪不到的那种

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT und…

    Java 2023年6月5日
    084
  • 稀疏数组转换思路及代码实现

    基本功能 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用 稀疏数组来保存该数组。 处理方法 记录数组 一共有几行几列,有多少个 不同的值 把具有不同值的元素的行列及值…

    Java 2023年6月16日
    085
  • idea警告 breakpoints dramatically slow down

    idea启动项目提示的黄色警告 , 其实就是有地方断点之后 , 影响项目运行速 打开断点管理 , 查看具体是哪个影响了 , 断点不需要了及时取消 Original: https:/…

    Java 2023年6月15日
    059
  • Golang中的面向对象与json转换

    一、struct 结构体 1.使用type关键字可以定义新的数据类型。 2.定义结构体,如: type Book struct{ title string author strin…

    Java 2023年6月13日
    067
  • 第2课第5节_Java面向对象编程_异常_P【学习笔记】

    摘要:韦东山android视频学习笔记 java的异常处理的原则如下: 1、我们先写一个没有对异常处理的程序,在进行除法运算的时候,除数是非零的话,运行时没有问题的,但是除数为零的…

    Java 2023年5月29日
    0102
  • 图解Dijkstra算法+代码实现

    简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstr…

    Java 2023年6月9日
    0108
  • Java应用工程结构

    分层的本质是关注点分离,隔离对下层的变化,可以简化复杂性,使得层次结构更加清晰。 1. 主流分层结构介绍 目前业界存在两种主流的应用工程结构:一种是阿里推出的《Java开发手册》中…

    Java 2023年5月29日
    095
  • 阿里云服务器中MySQL数据库被攻击

    前几天刚领了一个月的阿里云服务器玩,在里面装了MySQL,然后这几天找了个小项目练习着玩呢,就将表建在里面了。刚访问添加员工还好好的,刚给员工分页查询呢 ,啪一下 ,很突然昂 ,就…

    Java 2023年6月15日
    093
  • MarkDown学习

    MarkDown学习 二级标题 三级标题 三级标题 字体 helloworld 两边两个星号 _helloword_两边一个星号 _helloword_两边三个星号 hellowo…

    Java 2023年6月5日
    097
  • 在OpenCloudOS 上安装.NET 6

    开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立、全面开放、安全稳定、高性能的操作系统及生态。OpenCloudOS 沉淀了多家厂商在软件和开源生…

    Java 2023年6月5日
    086
  • Makedown学习与使用

    +标题名字 +标题名字 …… +标题名字 6级标题,从1-6级为1-6个# 字体 Hello,worldHello,worldHello,worldHell…

    Java 2023年6月9日
    087
  • ConcurrentHashMap中的get和put源码分析

    get分析 public V get(Object key) { // tab:指向数&am…

    Java 2023年6月16日
    077
  • 程序员你是如何降低NPE的?

    程序员,如果系统突然报了一个空指针异常,你肯定像吞了一只苍蝇一样尴尬。 那么如何在日常开发过程中降低NPE? 问题 回答 现状 返回空值会出现大量的空指针异常 目的 改进方法的返回…

    Java 2023年6月8日
    080
  • SpringBoot进阶教程(七十四)整合ELK

    在上一篇文章《SpringBoot进阶教程(七十三)整合elasticsearch 》,已经详细介绍了关于elasticsearch的安装与使用,现在主要来看看关于ELK的定义、安…

    Java 2023年6月8日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球