MyBatis的缓存,一级缓存,二级缓存

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

10、MyBatis的缓存

10.1、MyBatis的一级缓存

一级缓存是SqlSession级别的,通过同一个SqlSession对象 查询的结果数据会被缓存,下次执行相同的查询语句,就 会从缓存中(缓存在内存里)直接获取,不会重新访问数据库(数据库在磁盘里),也就是说就执行一次sql。一级缓存 默认开启

使一级缓存失效的四种情况:

  1. 不同的SqlSession对应不同的一级缓存

  2. 同一个SqlSession但是查询条件不同

  3. 同一个SqlSession两次查询之间执行了任意的增删改操作 。

    因为任意一次增删改操作会清空所有SqlSession的所有缓存---为什么?因为任意一次增删改可能会导致缓存的数据与增删改后的数据库中的数据不一致,我们肯定要以数据库中的为准,这是mybatis的机制,自动完成清空缓存。

  4. 同一个SqlSession两次查询期间手动清空了缓存

    sqlSession.clearCache();//手动清空一级缓存。一级缓存是sqlSession级别的

例子:

MyBatis的缓存,一级缓存,二级缓存,mybatis,mybatis,java,spring

10.2、MyBatis的二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession对象 查询的结果会被 缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取 。二级缓存不是默认开启的,开启需满足条件。

二级缓存开启的条件:

a>在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置

b>在映射文件中设置标签 <cache>

c>二级缓存必须在SqlSession关闭或提交之后有效

d>查询的数据所转换的实体类类型必须实现序列化的接口

使二级缓存失效的情况:

两次查询之间执行了任意的增删改操作,会使一级和二级缓存同时失效

咱自己创建的sqlSessionUtil工具类,每调一次,都新建一个SqlSessionFactory,然后再新建一个sqlSession。要想测试二级缓冲,可以自己直接写,不使用工具类。

    @Test
    public void testCache2() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);

        CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
        Emp emp1 = mapper1.getEmpByEmpId(1);
        sqlSession1.close();
        System.out.println(emp1);
        
        SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
        CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);
        Emp emp2 = mapper2.getEmpByEmpId(1);
        System.out.println(emp2);
        sqlSession2.close();
    }
Emp要实现序列化
映射文件里要加一个<cache>标签

10.3、二级缓存的相关配置

了解

在mapper配置文件中添加的cache标签可以设置一些属性:

①eviction属性:缓存回收策略,默认的是 LRU。

LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。

FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。

SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

②flushInterval属性:刷新间隔,单位毫秒 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

③size属性:引用数目,正整数 代表缓存最多可以存储多少个对象,太大容易导致内存溢出

④readOnly属性:只读, true/false

true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了 很重 要的性能优势。

false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。

10.4、MyBatis缓存查询的顺序

二级缓存的范围大于一级缓存的范围,也就是说,二级缓存中的数据要多于一级缓存中的。因为一个SqlSessionFactory可以对应多个SqlSession,而一个一级缓存只对应一个SqlSession。但是,SqlSession关闭之后,一级缓存中的数据才会写入二级缓存,所以,当SqlSession还没有关闭时,二级缓存中没有一级缓存中的一些数据,此时二级缓存可能没被命中,则查一级,若一级没命中(之前没有写入过一级缓存),则查数据库

查询顺序:2 ---> 1 ----> 数据库

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。

如果二级缓存没有命中,再查询一级缓存

如果一级缓存也没有命中,则查询数据库

SqlSession关闭之后,一级缓存中的数据才会写入二级缓存文章来源地址https://www.toymoban.com/news/detail-724976.html

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

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

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

相关文章

  • Mybatis一级缓存和二级缓存(带测试方法)

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

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

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(31)
  • Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

    Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Redis是当今十分主流的分布式key-value型数据库,在web开发中,我们常用它来缓存数据库的查询结果。 本篇博客将介绍如何使用Spring-Boot快速搭建一

    2024年01月17日
    浏览(42)
  • MyBatis缓存-提高检索效率的利器--一级缓存

    😀前言 本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博

    2024年02月14日
    浏览(31)
  • 手敲Mybatis(16章)-一级缓存功能实现

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

    2024年02月01日
    浏览(32)
  • Mybatis的二级缓存

    缓存的概述和分类   概述   缓存就是一块内存空间.保存临时数据   将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取的时候 ,直接从缓存中获取,可以减少和数据库交互的次数,这样可以提升程序的性能!   适用于缓存的:经常查询但不经常修改的(eg: 省市

    2023年04月12日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包