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. 以数字守护汉字!天翼云TeleDB数据库获GB 18030最高级别认证!

    近日,由工信部电子工业标准化研究院主办的GB 18030<信息技术 中文编码字符集>应用推广大会暨"汉字守护计划"成果发布会召开,工信部信发司.中央网信办信息化局.教育 ...

  2. 玩转云端 | 如何防爬虫?天翼云边缘安全加速平台AccessOne带你涨姿势!

    玩转云端 | 如何防爬虫?天翼云边缘安全加速平台AccessOne带你涨姿势!

  3. .NET中 泛型 + 依赖注入 的实现与应用

    在.NET中,注入泛型依赖项是一个常见的场景. 在依赖注入(DI)中使用泛型可以使得应用程序更加模块化.易于测试和扩展. 在ASP.NET Core中注册泛型服务 假设我们有一个需要注入的泛型接口 I ...

  4. 如何在Spring Boot项目中添加国密SM4加密支持?——基于过滤器的实现

    如何在Spring Boot项目中添加国密SM4加密支持呢?--基于过滤器的实现 引言 ​ 在数字化时代,数据安全至关重要,尤其是在API交互过程中,确保传输数据的安全性是保护隐私和机密信息的关键.中 ...

  5. Tensorflow 安装和测试(Anaconda4.7.10+windows10)

    一. 软件下载 二. 配置相关 1. 修改 Jupyter notebook 默认工作路径 (1)打开 Anaconda Prompt ,输入 jupyter notebook --generate- ...

  6. 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!

    大家好,我是编程乐趣. DeepSeek大火,网络上也看到很多人分享本地部署心得.但想要更细了解,还是要自己本地部署一次. 我这次部署目标,就是在局域网服务器部署,并让局域网其他电脑可以直接访问. 选 ...

  7. Esp32s3(立创实战派)移植LVGL

    Esp32s3(立创实战派)移植LVGL 移植: 使用软件EEZ studio 创建工程选择带EEZ Flow的,可以使用该软件更便捷的功能 根据屏幕像素调整画布为320*240 复制ui文件至工程 ...

  8. Flink - [06] 状态管理

    题记部分 一.Flink中的状态 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态. 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问. Flink会进行状态管理,包括状态一 ...

  9. Ansible - [02] 基础配置以及常用操作场景

    Ansible 基础配置 主配置文件:/etc/ansible/ansible.cfg ansible配置文件查找顺序 首先检测ANSIBLE_CONFIG变量定义的配置 其次检查当前目录下的./an ...

  10. 仿京东短信验证码UI效果(鸿蒙)

    整体思路: 外层Stack布局,里面TextInput组件用来调起键盘,Row布局中循环出四个Text组件,Row布局覆盖在TextInput组件上,用来展示输入的数字. 定义两个参数,code用来接 ...