Mybatis缓存

一、一级缓存
1. 概念
  • sqlsession级别的缓存,即缓存的是SQL语句
  • 同一个sqlsession中执行多次查询条件相同的SQL,mybatis会提供一级缓存进行优化
2. 开启和关闭
  • 开启

    • 默认开启
  • 关闭

    <setting name="localCacheScope" value="STATEMENT"/>

3. 使用
@Test
public void method() throws IOException {
// 1.读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); // 2.获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(); // 4.获取mapper
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); // 5.调用相应的方法
Student student = mapper.getStudentById(1);
System.out.println(student); System.out.println("----------------------------"); // 同一个sqlsession中执行相同的SQL查询,会走一级缓存
Student student1 = mapper.getStudentById(1);
System.out.println(student1); // 6.释放资源
sqlSession.close();
in.close();
}
4. 什么时候失效
  • 通过同一个SqlSession执行更新操作时,这个更新操作不仅仅指代update操作,还指插入和删除操作;
  • 事务提交时会删除一级缓存;
  • 事务回滚时也会删除一级缓存
5. 使用建议
平时使用MyBatis时都是和Spring结合使用的,在整个Spring容器中一般只有一个SqlSession实现类(bean默认是单例的)。而Spring一般都是主动提交事务的,所以说一级缓存经常失效。

还有就是我们也很少在一个事务范围内执行同一个SQL两遍,上面的这些原因导致我们在开发过程中很少注意到MyBatis一级缓存的存在。

不怎么用并不是说不用,作为一个合格的开发者需要对这些心知肚明,要清楚的知道MyBatis一级缓存的工作流程。

二、二级缓存
1. 概念
  • mapper级别的缓存
2. 开启
  • 核心配置文件:mybtis-config.xml

     <setting name="cacheEnabled" value="true"/>
  • mapper

    @CacheNamespace(blocking = true)
3. 使用

/**
* 二级缓存:
* 1.同一个sqlsession中,相同的SQL查询,会走缓存
* 2.中途执行了更新,则下次的SQL查询不走缓存
* 3.前面的sqlsession关闭之后,后面的sqlsession如果执行的是相同的SQL,则会走缓存
*
* @throws IOException
*/
@Test
public void method2() throws IOException {
// 1.读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); // 2.获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 3.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(); // 4.获取mapper
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); // 5.调用相应的方法
Student student = mapper.getStudentById(1);
System.out.println(student); System.out.println("----------------------------"); // 执行更新操作:查看下面的查询是否还会走缓存
// int num = mapper.updateById(1);
// System.out.println(" num = "+num);
//
// System.out.println("----------------------------"); sqlSession.close(); // 同一个sqlsession中执行相同的SQL查询,会走一级缓存
SqlSession sqlSession1 = sqlSessionFactory.openSession(); // 4.获取mapper
StudentMapper mapper1 = sqlSession1.getMapper(StudentMapper.class);
Student student1 = mapper1.getStudentById(1);
System.out.println(student1); // 6.释放资源
sqlSession1.close();
// sqlSession.close();
in.close();
}
4. 什么时候失效
  • 二级缓存是以namespace(Mapper)为单位的,不同namespace下的操作互不影响。
  • insert,update,delete操作会清空所在namespace下的全部缓存。
  • 多表操作一定不要使用二级缓存,因为多表操作进行更新操作,一定会产生脏数据。
5. 使用建议
MyBatis的二级缓存实用性不是很大。一个原因就是Spring环境下,一本只有一个SqlSession,不存在sqlSession之间共享缓存;还有就是
MyBatis的缓存都不能做到分布式,所以对于MyBatis的二级缓存以了解为主。
总结
1. 一级缓存
一级缓存的本质是Executor的一个类似Map的属性;
一级缓存默认开启,将flushCache设置成true或者将全局配置localCacheScope设置成Statement可以关闭一级缓存;
在一级缓存开启的情况下,查询操作会先查询一级缓存,再查询数据库;
增删改操作和事务提交回滚操作会导致一级缓存失效;
由于Spring中事务是自动提交的,因此Spring下的MyBatis一级缓存经常失效。(但是并不表示不生效,除非你手动关闭一级缓存)
不能实现分布式。
2. 二级缓存
namesapce级别的缓存(Mapper级别或者叫做表级别的缓存),设计的主要目的是实现sqlSession之间的缓存共享;
开启二级缓存后,查询的逻辑是二级缓存->一级缓存->数据库;
insert,update,delete操作会清空所在namespace下的全部缓存;
多表查询一定不要使用二级缓存,因为多表操作进行更新操作,可能会产生脏数据。
总体来说,MyBatis的缓存功能比较鸡肋。想要使用缓存的话还是建议使用spring-cache等框架。

看了他,妈妈再也不用担心我被问到Mybatis缓存了的更多相关文章

  1. 妈妈再也不用担心别人问我是否真正用过redis了

    1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...

  2. 有了 tldr,妈妈再也不用担心我记不住命令了

    引言 有一次我在培训时说「程序员要善于使用 Terminal 以提高开发效率」,一位程序员反驳道:「这是 21 世纪,我们为什么要用落后的命令行,而不是先进的 GUI?」 是的,在一些人眼里,这个黑黑 ...

  3. 妈妈再也不用担心我使用git了

    妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...

  4. python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了

    我们上次做了 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍 有些朋友觉得 利用正则表达式去提取信息 太特么麻烦了 有没有什么别的方式 更方便过滤我们想要的内容啊 emmmm 你还别说 还 ...

  5. 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了

    前几天,修电脑主析就捣鼓刷BIOS,结果刷完黑屏开不了机,立刻意识到完了,BIOS刷错了.就从网上查资料,各种方法试了个遍,什么用处都没有.终于功夫不负有心人,找到了编码器,知道了怎么用.下面看看具体 ...

  6. 锋利的js之妈妈再也不用担心我找错钱了

    用js实现收银功能. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...

  7. 收藏 | 15 个你非了解不可的 Linux 特殊字符,妈妈再也不用担心我看不懂这些符号了!

    不知道大家接触 Linux 系统有多久了,可曾了解过 Linux 中有哪些特殊的字符呢?其实啊,那些特殊字符都大有用处呢,今天的文章就给大家简单地科普一下 Linux 中你需要了解的 15 个特殊字符 ...

  8. 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了

    写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...

  9. 【C#】妈妈再也不用担心自定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚

    ------------------更新:201411190903------------------ 经过思考和实践,发现套路中的第1条是不必要的,就是完全可以不用定义一个名为Default+属性名 ...

  10. 妈妈再也不用担心我的移动端了:网易和淘宝的rem方案剖析

    从博主学习前端一路过来的经历了解到,前端移动开发是大部分从PC端转战移动端的小伙伴都非常头疼的一个问题,这边博主就根据一篇自己看过的移动开发文章来剖析一下网易和淘宝的rem解决方案,希望能够帮助到一些 ...

随机推荐

  1. Transformer 原理图解

    转载:小白看得懂的 Transformer (图解) 引言 谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界.而BERT取得成功的一个关键因素是Transformer的强 ...

  2. Linux:yum

    yum介绍 [yellow dog updater,modified],一个在Fedora和RedHat以及SUSE.Centos中的shell前段软件包管理器 能够自动的从指定的服务器自动下载RPM ...

  3. MySQL5.7x 主从复制

    原文链接:https://blog.liuzijian.com/post/9f8ede8e-26de-75d6-6347.html 在MySQL中,主从复制(Master-Slave Replicat ...

  4. android主线程与子线程

    创建子线程创建子线程 更多关于java线程的文章可以查看这两篇 线程1 创建线程的方法 在android中穿件子线程的方案很简单 创建子线程的几种方法 ///////第一种/////// class ...

  5. 浅谈ChatGPT在云计算资源调度的应用

    本文分享自天翼云开发者社区<浅谈ChatGPT在云计算资源调度的应用>,作者:张****兵 一.ChatGPT技术原理 ChatGPT 是基于 GPT(Generative Pre-tra ...

  6. JavaScript数组(包括上一笔记都是ECMAScript对象),BOM对象,DOM对象,html DOM Enent(事件)

    JavaScript数组(包括上一笔记都是ECMAScript对象),BOM对象,DOM对象,html DOM Enent(事件) 1.Arrary; var ret = new Arrary(1,2 ...

  7. JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的?

    JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的? 最近要做一个项目升级,因为之前的项目中有用到ElasticSearch 7.10.1版本,在之前的漏扫环节时会出现Tomcat渗透为问题 ...

  8. Monaco Editor 中使用在线版 Copilot

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:文长 引言 现代软件开发中,代码编辑器的功能不断演进,以满 ...

  9. 【ABP】项目示例(2)——聚合根和实体

    聚合根和实体 在上一章节中,已经完成了项目搭建的前置准备,在这一章节中,实现领域层的聚合根和实体 创建名称为General.Backend.Domain的标准类库,分别新建名称为Entities.Se ...

  10. OpenOffice已停更六年 文档基金会呼吁用户迁移LibreOffice

    OpenOffice 源代码发布至今已经有 20 年了.文档基金会近日发布公开信,表示说:"LibreOffice 是 OpenOffice 的未来.我们将会全力以赴".以此呼吁那 ...