首页 > 其他分享 >MyBatis 缓存

MyBatis 缓存

时间:2023-06-25 23:26:41浏览次数:36  
标签:缓存 Cache SqlSession 查询 二级缓存 MyBatis

 

MyBatis 一级缓存

1 一级缓存原理

在一次 SqlSession 中(数据库会话),程序执行多次查询,且查询条件完全相同,多次查询之间程序没有其他增删改操作,则第二次及后面的查询可以从缓存中获取数据,避免走数据库。

 

每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户。

Local Cache 其实是一个 hashmap 的结构:private Map<Object, Object> cache = new HashMap<Object, Object>();

2 一级缓存配置

在 mybatis-config.xml 文件配置,name=localCacheScope,value有两种值:SESSION 和 STATEMENT

<configuration>
    <settings>
        <setting name="localCacheScope" value="SESSION"/>
    </settings>
<configuration>

SESSION:开启一级缓存功能

STATEMENT:缓存只对当前执行的这一个 SQL 语句有效,也就是没有用到一级缓存功能。

3 MyBatis 一级缓存失效的场景

  1. 不同的SqlSession对应不同的一级缓存
  2. 同一个SqlSession但是查询条件不同
  3. 同一个SqlSession两次查询期间执行了任何一次增删改操作
  4. 同一个SqlSession两次查询期间手动清空了缓存

4 MyBatis 一级缓存总结

  • MyBatis一级缓存内部设计简单,只是一个没有容量限定的 HashMap,在缓存的功能性上有所欠缺

  • MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement

  • 一级缓存的配置中,默认是 SESSION 级别,即在一个MyBatis会话中执行的所有语句,都会共享这一个缓存。

MyBatis 二级缓存

1 MyBatis 二级缓存概述

  • MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。

  • MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件比较苛刻。

  • 在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将 MyBatis的Cache 接口实现,有一定的开发成本,直接使用Redis、Memcached 等分布式缓存可能成本更低,安全性也更高。

  • 2 MyBatis 二级缓存原理

    一级缓存最大的共享范围就是一个 SqlSession 内部,如果多个 SqlSession 之间需要共享缓存,则需要使用到二级缓存。

    开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在CachingExecutor 进行二级缓存的查询。

    二级缓存开启后,同一个 namespace下的所有操作语句,都影响着同一个Cache。

每个 Mapper 文件只能配置一个 namespace,用来做 Mapper 文件级别的缓存共享。

<mapper namespace="mapper.StudentMapper"></mapper>

二级缓存被同一个 namespace 下的多个 SqlSession 共享,是一个全局的变量。MyBatis 的二级缓存不适应用于映射文件中存在多表查询的情况。

通常我们会为每个单表创建单独的映射文件,由于MyBatis的二级缓存是基于namespace的,多表查询语句所在的namspace无法感应到其他namespace中的语句对多表查询中涉及的表进行的修改,引发脏数据问题。

 

3 MyBatis缓存查询的顺序

 

 

二级缓存配置

开启二级缓存需要在 mybatis-config.xml 中配置:

<settingname="cacheEnabled"value="true"/>



MyBatis 自定义缓存

1 MyBatis 自定义缓存概述

当 MyBatis 二级缓存不能满足要求时,可以使用自定义缓存替换。(较少使用)

自定义缓存需要实现 MyBatis 规定的接口:org.apache.ibatis.cache.Cache。这个接口里面定义了 7 个方法,我们需要自己去实现对应的缓存逻辑。

 

 

标签:缓存,Cache,SqlSession,查询,二级缓存,MyBatis
From: https://www.cnblogs.com/KL2016/p/17504221.html

相关文章

  • 2023-06-25:redis中什么是缓存穿透?该如何解决?
    2023-06-25:redis中什么是缓存穿透?该如何解决?答案2023-06-25:缓存穿透缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中。因此,每次请求都需要访问数据库,这将导致不存在的数据每次都需要查询存储层,这样缓存就失去了保护后端存储的作用。缓存穿透......
  • 2023-06-25:redis中什么是缓存穿透?该如何解决?
    2023-06-25:redis中什么是缓存穿透?该如何解决?答案2023-06-25:缓存穿透缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中。因此,每次请求都需要访问数据库,这将导致不存在的数据每次都需要查询存储层,这样缓存就失去了保护后端存储的作用。缓存......
  • Spring三级缓存与循环依赖
    三级缓存//一级缓存,存放的是完整的beanprivatefinalMap<String,Object>singletonObjects=newConcurrentHashMap<>(256);//二级缓存,存放的是半成品的bean,未完成属性注入privatefinalMap<String,Object>earlySingletonObjects=newHashMap<>(16);//三级缓存,存放的......
  • 记录--强制缓存这么暴力,为什么不使用协商缓存
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前段时间在看面经的时候,发现很多份面经中都被问到了强缓存和协商缓存。因此我觉得有必要写一篇文章来好好聊聊这两者。强缓存和协商缓存浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问......
  • RHEL CentOS Debian Ubuntu 如何刷新 DNS 缓存
    RHELCentOSDebianUbuntu如何刷新DNS缓存全文:如何刷新DNS缓存(macOS,Linux,Windows)UnixLinuxWindows如何刷新DNS缓存(macOS,FreeBSD,RHEL,CentOS,Debian,Ubuntu,Windows)请访问原文链接:https://sysin.org/blog/how-to-flush-dns-cache/,查看最新版。原创......
  • 如何清除浏览器的 DNS 缓存 (Chrome, Firefox, Safari)
    如何清除浏览器的DNS缓存(Chrome,Firefox,Safari)ChromeChromiumEdgeFirefoxSafariclearDNSCache,flushDNScache请访问原文链接:https://sysin.org/blog/clear-browser-dns-cache/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org天下只剩三种(主流)浏览......
  • 如何刷新 DNS 缓存 (macOS, Linux, Windows)
    如何刷新DNS缓存(macOS,Linux,Windows)UnixLinuxWindows如何刷新DNS缓存(macOS,FreeBSD,RHEL,CentOS,Debian,Ubuntu,Windows)请访问原文链接:https://sysin.org/blog/how-to-flush-dns-cache/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org刷新或者......
  • Chrome Edge Firefox Safari 如何清除 DNS 缓存
    ChromeEdgeFirefoxSafari如何清除DNS缓存如何清除浏览器的DNS缓存(Chrome,Firefox,Safari)ChromeChromiumEdgeFirefoxSafariclearDNSCache,flushDNScache请访问原文链接:https://sysin.org/blog/clear-browser-dns-cache/,查看最新版。原创作品,转载请保留出......
  • Linux 如何刷新 DNS 缓存
    Linux如何刷新DNS缓存全文:如何刷新DNS缓存(macOS,Linux,Windows)UnixLinuxWindows如何刷新DNS缓存(macOS,FreeBSD,RHEL,CentOS,Debian,Ubuntu,Windows)请访问原文链接:https://sysin.org/blog/how-to-flush-dns-cache/,查看最新版。原创作品,转载请保留出处。......
  • mybatis-执行器
    MyBatis中的Executor接口有三个实现类:SimpleExecutor:SimpleExecutor是最简单的Executor实现。它每次执行SQL语句时都会创建一个新的Statement对象。这种实现方式的缺点是效率较低,因为每次执行SQL语句都需要创建一个新的Statement对象。ReuseExecutor:ReuseExec......