依星源码资源网,依星资源网

用户名  找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 79|回复: 0

Mybatis缓存 看了他,妈妈再也不用担心我被问到Mybatis缓存了

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
15262
发表于 2025-4-15 12:09:46 | 显示全部楼层 |阅读模式
Mybatis缓存 看了他,妈妈再也不用担心我被问到Mybatis缓存了
一、一级缓存1. 概念
  • sqlsession级别的缓存,即缓存的是SQL语句
  • 同一个sqlsession中执行多次查询条件相同的SQL,mybatis会提供一级缓存进行优化
2. 开启和关闭
  • 开启
    • 默认开启
  • 关闭
    <setting name="localCacheScope" value="STATEMENT"/>

3. 使用
  1. @Test
  2.     public void method() throws IOException {
  3.         // 1.读取核心配置文件
  4.         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

  5.         // 2.获取sqlSessionFactory
  6.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);


  7.         // 3.获取sqlSession
  8.         SqlSession sqlSession = sqlSessionFactory.openSession();

  9.         // 4.获取mapper
  10.         StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

  11.         // 5.调用相应的方法
  12.         Student student = mapper.getStudentById(1);
  13.         System.out.println(student);



  14.         System.out.println("----------------------------");

  15.         // 同一个sqlsession中执行相同的SQL查询,会走一级缓存
  16.         Student student1 = mapper.getStudentById(1);
  17.         System.out.println(student1);



  18.         // 6.释放资源
  19.         sqlSession.close();
  20.         in.close();
  21.     }
复制代码
4. 什么时候失效
  • 通过同一个SqlSession执行更新操作时,这个更新操作不仅仅指代update操作,还指插入和删除操作;
  • 事务提交时会删除一级缓存;
  • 事务回滚时也会删除一级缓存
5. 使用建议
  1. 平时使用MyBatis时都是和Spring结合使用的,在整个Spring容器中一般只有一个SqlSession实现类(bean默认是单例的)。而Spring一般都是主动提交事务的,所以说一级缓存经常失效。

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

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

复制代码
二、二级缓存1. 概念
  • mapper级别的缓存
2. 开启
  • 核心配置文件:mybtis-config.xml
    1. <setting name="cacheEnabled" value="true"/>
    复制代码

  • mapper
    1. @CacheNamespace(blocking = true)
    复制代码


3. 使用
  1. /**
  2.      * 二级缓存:
  3.      *  1.同一个sqlsession中,相同的SQL查询,会走缓存
  4.      *  2.中途执行了更新,则下次的SQL查询不走缓存
  5.      *  3.前面的sqlsession关闭之后,后面的sqlsession如果执行的是相同的SQL,则会走缓存
  6.      *
  7.      * @throws IOException
  8.      */
  9.     @Test
  10.     public void method2() throws IOException {
  11.         // 1.读取核心配置文件
  12.         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");

  13.         // 2.获取sqlSessionFactory
  14.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);


  15.         // 3.获取sqlSession
  16.         SqlSession sqlSession = sqlSessionFactory.openSession();

  17.         // 4.获取mapper
  18.         StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

  19.         // 5.调用相应的方法
  20.         Student student = mapper.getStudentById(1);
  21.         System.out.println(student);


  22.         System.out.println("----------------------------");

  23.         // 执行更新操作:查看下面的查询是否还会走缓存
  24. //        int num = mapper.updateById(1);
  25. //        System.out.println(" num = "+num);
  26. //
  27. //        System.out.println("----------------------------");

  28.         sqlSession.close();

  29.         // 同一个sqlsession中执行相同的SQL查询,会走一级缓存
  30.         SqlSession sqlSession1 = sqlSessionFactory.openSession();

  31.         // 4.获取mapper
  32.         StudentMapper mapper1 = sqlSession1.getMapper(StudentMapper.class);
  33.         Student student1 = mapper1.getStudentById(1);
  34.         System.out.println(student1);



  35.         // 6.释放资源
  36.         sqlSession1.close();
  37. //        sqlSession.close();
  38.         in.close();
  39.     }
复制代码
4. 什么时候失效
  • 二级缓存是以namespace(Mapper)为单位的,不同namespace下的操作互不影响。
  • insert,update,delete操作会清空所在namespace下的全部缓存。
  • 多表操作一定不要使用二级缓存,因为多表操作进行更新操作,一定会产生脏数据。
5. 使用建议
  1. MyBatis的二级缓存实用性不是很大。一个原因就是Spring环境下,一本只有一个SqlSession,不存在sqlSession之间共享缓存;还有就是
  2. MyBatis的缓存都不能做到分布式,所以对于MyBatis的二级缓存以了解为主。
复制代码
总结1. 一级缓存
  1. 一级缓存的本质是Executor的一个类似Map的属性;
  2. 一级缓存默认开启,将flushCache设置成true或者将全局配置localCacheScope设置成Statement可以关闭一级缓存;
  3. 在一级缓存开启的情况下,查询操作会先查询一级缓存,再查询数据库;
  4. 增删改操作和事务提交回滚操作会导致一级缓存失效;
  5. 由于Spring中事务是自动提交的,因此Spring下的MyBatis一级缓存经常失效。(但是并不表示不生效,除非你手动关闭一级缓存)
  6. 不能实现分布式。

复制代码
2. 二级缓存
  1. namesapce级别的缓存(Mapper级别或者叫做表级别的缓存),设计的主要目的是实现sqlSession之间的缓存共享;
  2. 开启二级缓存后,查询的逻辑是二级缓存->一级缓存->数据库;
  3. insert,update,delete操作会清空所在namespace下的全部缓存;
  4. 多表查询一定不要使用二级缓存,因为多表操作进行更新操作,可能会产生脏数据。
  5. 总体来说,MyBatis的缓存功能比较鸡肋。想要使用缓存的话还是建议使用spring-cache等框架。

复制代码







相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图网站统计

GMT+8, 2025-4-26 16:23

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表