MyBatis缓存-提高检索效率的利器--一级缓存

这篇具有很好参考价值的文章主要介绍了MyBatis缓存-提高检索效率的利器--一级缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😀前言
本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析,希望能够帮助到您😊

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

MyBatis缓存-提高检索效率的利器

缓存-官方文档

文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache

一级缓存

基本介绍

基本说明
  1. 默认情况下,mybatis 是启用一级缓存的/本地缓存/local Cache,它是SqlSession 级别的。
  2. 同一个SqlSession 接口对象调用了相同的select 语句,会直接从缓存里面获取,而不是再去查询数据库
一级缓存原理图

MyBatis缓存-提高检索效率的利器--一级缓存,MyBatis,mybatis,缓存

一级缓存快速入门

需求: 当我们第1 次查询id=1 的Monster 后,再次查询id=1 的monster 对象,就会直接从一级缓存获取,不会再次发出sql。

代码实现

  1. 创建新module: mybatis_cache , 必要的文件和配置直接从mybatis_quickstart module拷贝即可。
  2. 需要拷贝的文件和配置如图

MyBatis缓存-提高检索效率的利器--一级缓存,MyBatis,mybatis,缓存

  1. 使用MonsterMapperTest.java , 运行getMonsterById() 看看是否可以看到日志输出,结论我们多次运行,总是会发出SQL.
    MyBatis缓存-提高检索效率的利器--一级缓存,MyBatis,mybatis,缓存

  2. 修改MonsterMapperTest.java, 增加测试方法, 测试一级缓存的基本使用+ Debug 源码

    //测试一级缓存
    @Test
    public void level1CacheTest() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //再次查询id=3的monster
        //当我们再次查询 id=3的Monster时,直接从一级缓存获取,不会再次发出sql
        System.out.println("--一级缓存默认是打开的,当你再次查询相同的id时, 不会再发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.close();
        }
    }

测试结果

MyBatis缓存-提高检索效率的利器--一级缓存,MyBatis,mybatis,缓存

Debug 一级缓存执行流程

sqlSession 的结构示意图

MyBatis缓存-提高检索效率的利器--一级缓存,MyBatis,mybatis,缓存

一级缓存失效分析

一.关闭sqlSession 会话后

关闭sqlSession 会话后, 再次查询,会到数据库查询, 修改MonsterMapperTest.java, 测试一级缓存失效情况

//测试一级缓存,失效
    //关闭sqlSession会话后 , 一级缓存失效
    @Test
    public void level1CacheTest2() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //关闭sqlSession, 一级缓存失效
        if (sqlSession != null) {
            sqlSession.close();
        }

        //因为关闭了sqlSession,所以需要重新初始化sqlSession和 monsterMapper
        sqlSession = MyBatisUtils.getSqlSession();
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        //再次查询id=3的monster
        System.out.println("--如果你关闭了sqlSession,当你再次查询相同的id时, 仍然会发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.close();
        }
    }

二.执行sqlSession.clearCache()

当执行sqlSession.clearCache() 会使一级缓存失效,修改MonsterMapperTest.java, 测试一级缓存失效情况

//测试一级缓存,失效
    //如果执行sqlSession.clearCache() , 会导致一级缓存失效
    @Test
    public void level1CacheTest3() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //执行clearCache
        /**
         * @Override
         *   public void clearCache() {
         *     executor.clearLocalCache();
         *   }
         */
        sqlSession.clearCache();

        //再次查询id=3的monster
        System.out.println("--如果你执行sqlSession.clearCache(),当你再次查询相同的id时, 仍然会发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.close();
        }
    }

三.当对同一个monster 修改

当对同一个monster 修改,该对象在一级缓存会失效, 修改MonsterMapperTest.java, 测试一把

 //测试一级缓存,失效
    //如果修改了同一个对象 , 会导致一级缓存[对象数据]失效
    @Test
    public void level1CacheTest4() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //如果修改了同一个对象 , 会导致一级缓存[对象数据]失效
        monster.setName("蚂蚱精");
        monsterMapper.updateMonster(monster);

        //再次查询id=3的monster
        System.out.println("--如果你修改了同一个对象,当你再次查询相同的id时, 仍然会发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.commit();//这里需要commit
            sqlSession.close();
        }
    }

😄总结

  1. 默认情况下,mybatis 是启用一级缓存的/本地缓存/local Cache,它是SqlSession 级别的。SqlSession 会话关闭,一级缓存就结束了。
  2. 同一个SqlSession 接口对象调用了相同的select 语句,会直接从缓存里面获取,而不是再去查询数据库。
  3. 关闭SqlSession 、执行clearCache()、修改对象,都会导致缓存失效。

热门推荐

对缓存感兴趣的朋友可以看看博主的缓存篇–
MyBatis缓存-提高检索效率的利器–二级缓存

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞文章来源地址https://www.toymoban.com/news/detail-621277.html

到了这里,关于MyBatis缓存-提高检索效率的利器--一级缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis 一级缓存和二级缓存 与hibernate 一级缓存和二级缓存 有什么区别?

    MyBatis和Hibernate都是流行的持久化框架,它们都提供了一级缓存和二级缓存的功能,但在实现和使用上有一些区别。 一级缓存: - MyBatis的一级缓存是默认开启的,它是在SqlSession级别的缓存,也就是在同一个SqlSession中,如果多次查询同样的SQL语句,那么只会执行一次数据库查

    2024年02月15日
    浏览(34)
  • Mybatis一级缓存和二级缓存(带测试方法)

    目录 相关导读 一、什么是缓存  二、Mabtis一级缓存 (1)测试一级缓存

    2023年04月08日
    浏览(79)
  • Mybatis的一级、二级缓存怎样使用?

    一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。 二级缓存是基于namespace和mappe的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储 当某一个作用域

    2024年02月16日
    浏览(43)
  • mybatis分页、延迟加载、立即加载、一级缓存、二级缓存

    分类 : 使用Limit,来进行分页;物理分页 使用RowBounds集合来保存分页需要数据,来进行分页;逻辑分页;本质是全查,只是显示部分 使用分页插件来进行分页;物理分页 方式一: 方式二: 方式三: 首先导入两个jar包: 配置插件: 调用: 字段 含义 pageNum 当前页的页码 pa

    2024年01月18日
    浏览(56)
  • 手敲Mybatis(16章)-一级缓存功能实现

    这一节的目的主要是实现SqlSession级别的缓存,也就是一级缓存,首先看下图一,用户可以通过设置来进行是否开启一级缓存,不设置的化默认开启一级缓存,localCacheScope=SESSION为要设置一级缓存,localCacheScope=STATEMENT为不要设置一级缓存,(所以后面在清理缓存时会进行判断,

    2024年02月01日
    浏览(42)
  • mybatis的一级二级缓存详解及源码解剖

    一级缓存是指在同一个SqlSession中,对于相同的查询语句和参数,第一次查询的结果会被缓存到内存中,后续的查询会直接从缓存中获取结果,而不会再次查询数据库。一级缓存是MyBatis默认开启的,可以通过在SqlSession中调用clearCache()方法来清空缓存。 二级缓存是指在多个Sq

    2024年02月05日
    浏览(54)
  • Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存&二级缓存

    缓存越小,查询速度越快,缓存数据越少 缓存越大,查询速度越慢,缓存数据越多 在多级缓存中,一般常见的是先查询一级缓存,再查询二级缓存,但在Mybatis中是先查询二级缓存,再查询一级缓存。 在Mybatis中,BaseExecutor属于一级缓存执行器,CachingExecutor属于二级缓存执行

    2024年02月14日
    浏览(44)
  • MyBatis-Plus一级缓存和二级缓存-redis解决缓存的脏数据

    什么是缓存? 1.存在内存中的临时数据 2.将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库 数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 为什么使用缓存 减少和数据库的交互次数,减少系统开

    2024年02月09日
    浏览(40)
  • 如何提高LLC(最后一级缓存)的命中率?

    目录 为什么需要高速缓存? Cache 的数据结构和读取过程是什么样的? CPU 高速缓存的写入 写直达(Write-Through) CPU 的内部结构 多处理器和 NUMA 多核结构和多级缓存 超线程(Hyperthreading,HT) CPU 性能指标和常见性能问题 CPU 的性能监测工具 性能问题:最后一级缓存(LLC)不命

    2023年04月08日
    浏览(42)
  • AIGC 工具推荐:利用 AI 提高工作效率的利器

    人工智能(AI)正在改变我们的生活,使我们的工作更加高效和智能化。在这个快速发展的领域中,有许多 AI 实用工具可以帮助我们更好地完成工作。在未来熟练使用各种 AI 工具优化你的工作流并提高工作效率将是每个人的必备技能,是时候收集一些便宜好用的实用 AI 工具

    2024年02月09日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包