首页 > 其他分享 >一级缓存和二级缓存原理与使用

一级缓存和二级缓存原理与使用

时间:2022-10-27 12:13:35浏览次数:61  
标签:缓存 userDao 一级 二级缓存 查询 SqlSession 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下的操作互不影响
如果在加入标签的前提下让个别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之间共享缓存数据。

标签:缓存,userDao,一级,二级缓存,查询,SqlSession,Mybatis
From: https://www.cnblogs.com/little-monster-lhq/p/16831766.html

相关文章

  • nginx+lua+redis实现广告缓存
    需求分析#需要在页面上显示广告的信息。OpenResty#OpenResty介绍#OpenResty(又称:ngx_openresty)是一个基于NGINX的可伸缩的Web平台,由中国人章亦春发起,提供了很多......
  • 整数缓存池
    intnum1=100;//基本类型的定义Integernum2=100;Integernum3=Integer.valueOf(100);//同一个对象,都在数组里面Integernum4=newInteger(100);Integernum5=newInt......
  • 聊一聊作为高并发系统基石之一的缓存,会用很简单,用好才是技术活
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。在......
  • MySQL基础篇--全局缓存和线程缓存
    MySQL全局缓存key_buffer_size决定索引处理的速度,尤其是索引读的速度。默认值是16M,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例......
  • log4net 文件日志缓存(buffersize)
    公司用log4net记录日志,文件的形式,后面想记录的东西越来越多。发现会出现文件被占用的情况。就想log4net应该有缓存,当要写入的文件达到一定数量的时候再写入。然后在网上查......
  • Git配置、缓存用户名密码和清除缓存
    配置用户名和邮箱:gitconfig--globaluser.name"username"gitconfig--globaluser.email"[email protected]"清除配置中纪录的用户名和密码,下次提交代码时会让重......
  • linux 清理java缓存,Linux手动释放缓存的方法
    Linux释放内存的命令:syncecho1>/proc/sys/vm/drop_cachesdrop_caches的值能够是0-3之间的数字,表明不一样的含义:0:不释放(系统默认值)1:释放页缓存2:释放dentries和in......
  • 负载均衡环境下缓存处理
    深入学习EnterpriseLibraryfor.NETFramework2.0的Cache机制——分析篇,这篇文章介绍了很多Caching方面的内容,我就不详细说了,我这里主要说一个最近......
  • ASP.NET 4 AppFabric 输出缓存提供程序
    缓存是用来保存你数据的地方,从而使你的应用程序访问更快速。缓存可以根据你的需要分配到许多台机器上,而开发人员无需关心数据究竟在哪台机器上。为了获得......
  • el-cascader组件根据最后一级向上找到父级并设置默认值
    vue+ elementUI项目中,el-cascader级联选择器使用频率非常高,一些基本使用方法可以参考elementUI官方文档,本文主要研究当接口只返回最后一级id时,如何向上找出所有父级数据,......