Mybatis的一级缓存和二级缓存原理分析与使用

 更新时间:2021年11月26日 10:03:58   作者:老达摩#  
mybatis-plus 是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章带你了解Mybatis的一级和二级缓存

Mybatis的一级缓存和二级缓存

Mybatis会将相同查询条件的SQL语句的查询结果存储在内存或者某种缓存介质中,当下次遇到相同的SQL时不执行该SQL,而是直接从缓存中获取结果,减少服务器的压力,尤其是在查询越多、缓存命中率越高的情况下,使用缓存对性能的提高更明显。

Mybatis缓存分为一级缓存和二级缓存,一级缓存是将结果缓存在SqlSession对象中,二级缓存是存储在SqlSessionFactory对象中。默认情况下,Mybatis开启一级缓存,不开启二级缓存当数据量更大时,可以借助第三方缓存技术协助保存Mybatis的二级缓存数据

请添加图片描述

如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用 SqlSession中执行了任何一个update操作(update()、delete()、insert()),都会清空PerpetualCache对象的数据,但是该对象可以继续使用

1 Mybatis如何判断两次查询是完全相同的查询

如果以下条件完全一样,Mybatis则认为是相同的查询

-- 传入的statementid。
-- 查询时要求的结果集中的结果范围
-- 这次查询所产生的最终要传递给Preparedstatement的Sql语句字符串
-- 传递的参数值

@Test
    public void testCacheOne(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        Users users = userDao.selectUsersById(1);
        Users users1 = userDao.selectUsersById(1);
        System.out.println(users);
        System.out.println(users1);
    }

请添加图片描述

查询两次,数据库查询了一次

    @Test
    public void testCacheOne(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        Users users = userDao.selectUsersById(1);
        //清空缓存
        sqlSession.clearCache();
        Users users1 = userDao.selectUsersById(1);
        System.out.println(users);
        System.out.println(users1);
    }

请添加图片描述

清空缓存,数据库查询了两次

2 二级缓存

​ Mybatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,二级缓存SqlSessionFactory上缓存,可以是由一个SqlSessionFactory创建的不同的SqlSession之间共享缓存数据。默认不开启。SqlSession在执行commit()或者close()的时候将数据放入到二级缓存

请添加图片描述

请添加图片描述

2.1 二级缓存配置

Mybatis实现二级缓存的实体类必须是可序列化的,也就是要求实现Serializable接口。在映射配置文件中配置就可以开启缓存了

2.2 二级缓存特点

映射语句文件中的所有select查询语句都会被缓存
insert、update、delete语句会刷新缓存
二级缓存是以namespace为单位,不同namespace下的操作互不影响
如果在加入<cache/>标签的前提下让个别select元素不适用缓存,可以使用useCache属性,设置为false

2.3 配置二级缓存

在mybatis-config.xml文件中标签配置开启二级缓存。cacheEnabled的值就是true,可省略

<settings>
    <setting name="cacheEnable" value="true"/>
</settings>

在映射文件中添加

<mapper namespace="com.zd.dao.UserDao">
    <cache/>
</mapper>

2.4 测试

请添加图片描述

    @Test
    public void testCacheTwo(){
        SqlSession sqlSession=MybatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        Users users = userDao.selectUsersById(1);
        System.out.println(users);
        //关闭SqlSession后,重新获取SqlSession对象查询
        MybatisUtil.closeSqlSession();
        SqlSession sqlSession2=MybatisUtil.getSqlSession();
        UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
        Users users2 = userDao2.selectUsersById(1);
        System.out.println(users2);
    }

请添加图片描述

查询了一次,可以看出不同的SqlSession之间共享缓存数据。

到此这篇关于Mybatis的一级缓存和二级缓存原理分析与使用的文章就介绍到这了,更多相关Mybatis 缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven生成及安装jar包到本地仓库的方法

    Maven生成及安装jar包到本地仓库的方法

    这篇文章主要介绍了Maven生成及安装jar包到本地仓库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring整合Quartz Job以及Spring Task的实现方法

    Spring整合Quartz Job以及Spring Task的实现方法

    下面小编就为大家分享一篇Spring整合Quartz Job以及Spring Task的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • SpringBoot实现文件在线预览功能的全过程

    SpringBoot实现文件在线预览功能的全过程

    我们开发业务系统的时候,经常有那种文档文件在线预览的需求,下面这篇文章主要给大家介绍了关于SpringBoot实现文件在线预览功能的相关资料,需要的朋友可以参考下
    2021-11-11
  • Java单例模式与破坏单例模式概念原理深入讲解

    Java单例模式与破坏单例模式概念原理深入讲解

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建
    2023-02-02
  • Swift洗牌动画效果的实现方法

    Swift洗牌动画效果的实现方法

    这篇文章主要介绍了Swift洗牌动画效果的实现方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2016-12-12
  • springboot Interceptor拦截器excludePathPatterns忽略失效

    springboot Interceptor拦截器excludePathPatterns忽略失效

    这篇文章主要介绍了springboot Interceptor拦截器excludePathPatterns忽略失效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java中从JSON转Java实体的多种方法详解

    Java中从JSON转Java实体的多种方法详解

    在现在的日常开发中不管前端还是后端,JSON 格式的数据是用得比较多的,甚至可以说无处不在,这篇文章主要给大家介绍了关于Java中从JSON转Java实体的多种方法,需要的朋友可以参考下
    2023-12-12
  • JVM调整java虚拟机可使用的最大内存的方法

    JVM调整java虚拟机可使用的最大内存的方法

    本文主要介绍了调整JVM的内存参数来优化Java应用程序的性能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Mybatis初始化知识小结

    Mybatis初始化知识小结

    Mybatis的初始化过程就是加载自己运行时所需要的配置信息的过程,这篇文章主要介绍了Mybatis初始化知识小结,需要的朋友可以参考下
    2021-10-10
  • Java虚拟机调用Java主类的main()方法

    Java虚拟机调用Java主类的main()方法

    这篇文章主要介绍了Java虚拟机调用Java主类的main()方法,前一篇文章我们介绍了关于Java虚拟机HotSpot
    2021-11-11

最新评论