概述

针对查询操作,mybatis支持通过缓存的方式来减少SQL的调用,提高查询性能。在缓存级别方面分为一级缓存和二级缓存,

  1. 一级缓存的粒度较小,是与某个SqlSession绑定的,只对该SqlSession的相关查询操作进行缓存,不同SqlSession实例之间相互不影响,缓存为使用本地内存实现;
  2. 二级缓存是一种全局缓存,是由所有SqlSession实例所共享的,即不同SqlSession实例查询时产生的缓存,对其他SqlSession实例可见。

一级缓存

  • mybatis的一级缓存支持两种缓存级别,分别是SESSION和STATEMENT,默认的一级缓存级别为SESSION。
  • mybatis的一级缓存是默认开启的。
  • 一级缓存的使用示意图如下:(图片引用自:mybatis一级缓存二级缓存)

SESSION级别

  • 对该SqlSession实例发起的查询操作进行缓存,即由同一SqlSession实例发起的多次相同(SQL和SQL的参数值都相同)的查询操作,第一次是查询数据库,后续则查询缓存;但是如果另外一个SqlSession实例进行相同的查询操作,则需要进行数据库查询。
  • 针对更新操作,如果是该SqlSession自身进行了更新操作,则该SqlSession对应的一级缓存会被清空,但是如果是其他SqlSession实例进行了更新操作,则此更新操作对该SqlSession不可见,所以该SqlSession的缓存数据是过期失效数据,所以SqlSession实例的生命周期不能过长,否则可能出现数据不一致现象。

STATEMENT级别

  • 该级别是指缓存只针对当前执行的查询语句有效,故每次语句执行完之后都会清空缓存,其实是相当于没有缓存,即该sqlSession实例下次调用相同的SQL语句和相同参数值时,由于上一次语句执行后,缓存被清空了,故需要继续查询数据库。具体可以看源码的query实现:

配置方法

  • mybatis的一级缓存是内部实现的一个特性,用户不能配置,默认情况下为开启的。同时内部也是使用一个基于HashMap实现的本地内存来实现,故在配置方面只能配置缓存级别为STATEMENT来关闭一级缓存。配置主要是在全局配置mybatisConfig.xml中配置,如下:
<?xml version="1.0" encoding="UTF-8" ?>  ...    ...

二级缓存

  • mybatis默认没有开启二级缓存,二级缓存支持在配置中自定义底层所用的缓存实现,包括使用本地内存和分布式缓存。
  • 二级缓存是基于namespace的,即作用域为mapper,故需要在每个mapper中配置自身所使用的二级缓存实现以及缓存策略。同时由于二级缓存是基于namespace的,所以不同namespace之间的相互不影响的,如一个namespace使用的本地内存,另外一个namespace使用的是分布式缓存,则如果不同namespace对同一张数据表的数据进行了操作,则可能会存在数据不一致问题。
  • 如果二级缓存使用本地内存的话,则由于开启二级缓存之后,需要在本地内存缓存大量的数据,即对所有SqlSession实例的查询进行缓存,故可能造成内存资源的开销较大。
  • 二级缓存的使用示意图如下:(图片引用自:mybatis一级缓存二级缓存)

配置方法

  • 二级缓存的配置分为三步:

1.首先在mybatisConfig.xml文件中配置全局开关的:

<?xml version="1.0" encoding="UTF-8" ?>  ...    ...

2.然后需要在各个mapper对应的配置文件mapper.xml中配置cache标签,可以指定该mapper使用的二级缓存的底层实现和相关缓存配置等。cache标签也可以是空标签,则使用默认的基于本地内存的二级缓存实现。

3.这步是可选的,即在mapper内部的每个select可以通过useCache开关来控制当前查询select是否使用二级缓存:默认为true。

 ... 

总结

  • 由以上分析可知,虽然一级和二级缓存的使用可以减少数据库查询操作,但是都存在造成数据不一致的情况存在:对于一级缓存由于不同sqlSession实例之间相互隔离,则可能出现其中一个更新了数据库数据,但是另外一个由于使用了自身内部的缓存,故读取到失效的旧数据;对于二级缓存,由所有sqlSession实例共享,基于namespace隔离,故如果不同namespace定义了同时操作一个表的SQL语句,则会造成不同namespace之间的缓存不一致问题。所以如果对于mybatis的内部运作机制不理解,可能会由于这些造成数据不一致的情况存在,则可能会导致莫名其妙的问题。
  • 针对以上这些问题,建议统一使用额外的缓存实现,即在应用代码中自定义缓存实现,关闭mybatis的一级和二级缓存,只使用mybatis基于SQL来进行数据库操作。

thinkcmf5调用指定分类的二级_Mybatis一二级缓存的使用和实现原理相关推荐

  1. thinkcmf5调用指定分类的二级_Tengine快速上手系列教程amp;视频:基于Python API的图片分类应用入门丨附彩蛋...

    前言:近期,Tengine团队加班加点,好消息接踵而来,OpenCV 4.3.0发布,OPEN AI LAB AIoT智能开发平台Tengine与OpenCV合作共同加速边缘智能,Tengine再获业 ...

  2. thinkcmf5调用指定分类的二级_python机器学习API介绍11: 伯努利贝叶斯分类器

    BernoulliNB是伯努利贝叶斯分类器,它是假设模型的条件概率分布满足对应的二次项分布,其原型为: class sklearn.naive_bayes.BernoulliNB(alpha=1.0, ...

  3. ecshop调用指定分类(包含子分类)下所有产品的评论信息

    调用指定分类(包含子分类)下所有产品的评论信息,使用了ecshop系统自带的函数get_children($cat_id)调用指定分类下所有子分类的id,该自带函数在文件include/lib_com ...

  4. ectouch手机商城首页调用指定分类下的商品

    ECTouch是国内市面上唯一开源的ECSHOP移动商城系统,为广大电商以最低的成本快速搭建移动商城.最近最一商城实例,手机版首页需要调用指定分类下的商品,ECtouch商城默认好像没有此调用方式,只 ...

  5. zblog php 指定分类,zblogPHP如何调用指定分类的置顶文章

    站长圈子里可真是人人都是产品经理啊,各种奇葩的需求都会碰到,今天有个老哥就咨询我zblogphp程序如何调用指定分类的置顶文章,也不知道是应用在他网站的哪个模块区域了. 扯远了说正事,直接上代码{fo ...

  6. php刷新热销商品,ecshop首页如何调用指定分类下的推荐热销最新商品

    其实这个在ecshop中预留这个函数,不知道是不是开发者特意留下,但不想让所有人知道而已,函数在includes/lib_goods.php里面. 下面开始教你如何添加指定分类的下热销产品: 1.在首 ...

  7. ecshop首页调用指定分类的所有产品(指定一级调二级)

    第一种方法 第一 在/includes/lib_goods.php下增加如下代码,用过网上的直接换掉就可以 function index_get_cat_id_goods_best_list($cat ...

  8. wordpress 首页调用指定分类文章_怎样给wordpress网站分类目录页面,添加文章列表和分页效果?...

    在前面的章节中,我们完成了wordpress网站首页模板数据的调用,也创建好了wordpress网站的公共模板.今天,我们再来给wordpress网站的分类目录页模板archive.php文件添加左侧 ...

  9. ecshop调用指定ID分类下的文章列表(指定分类下的文章)

    我们先打开根目录下的article_cat.php这个文件, 在第19行      require(dirname(__FILE__) . '/includes/init.php') 这是一个加载in ...

  10. 熱銷商品查詢php,ecshop首页调用指定商品分类下推荐热销最新商品

    其实这个在ecshop中预留这个函数,不知道是不是开发者特意留下,但不想让所有人知道而已,函数在includes/lib_goods.php里面. 下面开始教你如何添加指定分类的下热销产品: 1.在首 ...

最新文章

  1. 剑指Offer 替换空格
  2. flex java_Flex与Java通信 (一)
  3. x86 Assembly Guide
  4. mysql存储过程类_mysql存储过程类
  5. 软件测试第四组第一周作业第一天
  6. I2C接口触摸屏驱动分析
  7. 长江中游水文站点流量数据下载及处理
  8. LaTeX中生成标题、摘要、关键词、目录方法以及自定义所需样式
  9. 用EasyBoot轻松做启动光盘
  10. 什么是泛域名?如何做泛域名解析?
  11. jQuery获取元素属性值为undefined
  12. vue3 setup语法糖事件引用和写法
  13. Linux进程创建fork、进程退出exit()、进程等待waitpid()
  14. 阿里云数加案例-美柚
  15. 计算机程序无法启动,应用程序无法正常启动,教您电脑应用程序无法正常启动0xc000007b怎么解决...
  16. 环评师c语言题目,C语言考试——编程题_文库吧
  17. 关于对接海康设备的坑
  18. 一篇文章看懂如何转行产品经理
  19. 外网映射工具(操作很简单)
  20. 红米5plus刷android one,史上最详细的魔趣刷机教程(没有之一!!!!)

热门文章

  1. 正则表达式,小于等于180且大于等于0的浮点型
  2. java使用derby增删改查_JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)...
  3. android 进入三方应用动画,Android 动画各种实现总结分享 AndroidAnimationExercise
  4. STM32-关于Proteus 仿真无法运行STM32CubeMX自动生成的代码
  5. VUE配置本地代理服务器
  6. mybaits.xml文件约束,头部
  7. ftp协议是一种用于什么的协议_购房协议怎么写?签购房协议要注意什么
  8. php %3cpre%3c pre%3e,实验报告五 web 攻击靶机解题过程(未完成)
  9. 【转】余弦相似度及基于python的三种代码实现、与欧氏距离的区别
  10. Oracle redo解析之-1、oracle redo log结构计算