Mybatis二级缓存的缺陷_mybatis二级缓存的缺点-程序员宅基地

技术标签: 经典面试题  mybatis  MyBatis  

  • 一级缓存默认是开启的(但是整合了Spring,Mybatis的一级缓存默认就失效了)
  • 二级缓存是要手动配置开启的(二级缓存是mapper级别的缓存,可以跨SqlSession)

Mybatis二级缓存

开启二级缓存(xml方式):在*Mapper.xml中加入如下代码

<!--eviction: 清空缓存的策略
    readOnly: 是否只读
    flushInterval: 每个60秒刷新一次缓存
    size: 内存大小,最多存储结果对象或者列表的512个引用 -->
<cache readOnly="true" eviction="FIFO" flushInterval="60000" size="512"/>

缓存清除策略

  • LRU – 最近最少使用:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

两种方式二选一,如果都配置会报错:Caches collection already contains value for com.lixianhe.dao.UserMapper

注意:使用Mybatis二级缓存必须是xml写SQL语句,不能使用注解写SQL语句

缓存的执行顺序

  • 先从二级缓存中查询,二级缓存没有进入SqlSession中查询
  • SqlSession没有就去数据库查询,然后存到一级缓存中,查询完关闭SqlSession
  • 一级缓存再提交给二级缓存

在开启二级缓存的情况下执行一条sql

select colA1, colA2, colB1, colB2 
from A, B 
where ...
  1. A表执行了上述的sql
  2. B表更新了字段cloB1,colB2
  3. A表再次执行了上述的sql(前提没有执行insert、update、delete)

A表第二次就查询出了脏数据(B表的数据就是脏数据),这个问题对二级缓存来说是一个无解的问题

因此Mybatis二级缓存的使用用一个前提,必须保证所有的增删改查都在同一个namespace下才行

由于二级缓存的弊端,所以并不建议在实际生产中使用,而是在外部实现自己的缓存,如使用Redis做缓存

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_56750901/article/details/125530370

智能推荐

鸢尾花数据集,特征为连续值数据的决策树的多分类-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏2次。1.导入工具import pandas as pdfrom sklearn import preprocessingfrom sklearn import treefrom sklearn.datasets import load_iris2.导入鸢尾花数据集,探索数据集iris=load_iris()#iris是一个字典,包含了数据、标签、标签名、数据描述等信息。可以通过键来索引对应值。iris#查看iris字典里的所有键dir(iris)iris.data#150个数据,每个

springboot配置国际化_spring i18n can't find bundle for base name messag-程序员宅基地

文章浏览阅读684次。1. springboot引入国际化首先要导入Thymeleaf 模板Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持html 原型,然后在html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释html 时会忽略未定义的标签属性,所以thymeleaf 的_spring i18n can't find bundle for base name messages, locale en_us

多线程与并发—面试题1_java 两个进程一个读,一个写 并发问题-程序员宅基地

文章浏览阅读286次。1、缓存一致性?解决的办法? 当程序在运行过程中,会把数据从主存复制一份到CPU的高速缓存,然后直接从高缓提取数据,然后再刷新回主存中。 解决的办法:1)通过在总线增加LOCK#锁的方式(通过加锁方式,效率会降低) 2)通过缓存一致性协议2、volatile关键字 一旦一个共享变量被volatile修饰,就具备两层含..._java 两个进程一个读,一个写 并发问题

解决Ubuntu下Sublime中无法输入中文问题-程序员宅基地

文章浏览阅读36次。然而,在Ubuntu操作系统中,有时候我们可能会遇到在Sublime Text中无法输入中文的问题。通过安装和配置fcitx输入法框架,并切换到中文输入法,我们可以解决在Ubuntu下Sublime Text中无法输入中文的问题。在Ubuntu操作系统中,当我们尝试在Sublime Text中输入中文时,可能会发现无法输入中文字符,或者输入的中文字符显示为乱码。在Ubuntu上,我们可以使用fcitx输入法框架来解决Sublime Text中无法输入中文的问题。在打开的界面中,点击"+“按钮来添加输入法。

TM034XVZP01 mipi屏 高通8909平台lk和kernel驱动 基于ili9881驱动_msm8909屏幕点亮-程序员宅基地

文章浏览阅读1.8k次。效果图如上。 所需的时序文件链接 https://download.csdn.net/upload/11120468 大家可以下载参考上述是最终的成果,该文章只着重讲述lk阶段的调试过程,lk阶段调试好之后,kernel层只需根据lk阶段的参数生成dtsi文件,修改一下相应的显示文件即可。一:调试步骤1.首先调试lk阶段的代码1.1 用安卓源码路径“device..._msm8909屏幕点亮

嵌入式JetSon TX2上定位构图与目标检测环境部署(包括RTAB-MAP、Object Detection API、RealSense、IMU、ROS、CUDA、Tensorflow等配置)_e: unable to locate package librealsense2-dkms-程序员宅基地

文章浏览阅读2k次。这周为了项目结题在一块崭新的TX2开发板上复现了去年的定位构图与目标检测环境部署,其实各个部分的内容在博主之前的博客中零零碎碎的都提到过,这里重新写篇博客整体总结一下,因为后面还有两块新的TX2等待博主部署环境......流下了熟练工种的泪水QAQ_e: unable to locate package librealsense2-dkms

随便推点

环境变量_Anaconda3环境变量的搭建-程序员宅基地

文章浏览阅读468次。Anaconda安装完成后,通常还要进行环境变量的配置,否则会产生如下报错(以Windows10系统中PowerShell终端窗口为例)。在资源管理器任意路径下按住“Shift”键并右击鼠标,选择“在此处打开PowerShell窗口”,并在其中执行命令conda list如果发现系统报错“conda list不能被识别”,这就需要我们进一步手动进行环境变量的配置。01W..._add anaconda3 to my path

optimizer.step()代表什么意思-程序员宅基地

文章浏览阅读5.8k次,点赞20次,收藏49次。`optimizer.step()`是PyTorch中优化器对象的一个方法,用于更新模型的参数。在训练深度神经网络的过程中,我们需要通过反向传播算法计算每一个参数对损失函数的梯度,然后使用优化器更新参数,使得损失函数最小化。而`optimizer.step()`方法就是用于执行参数更新的。_optimizer.step()

iOS 9.3.5 越狱_use privded iffsets-程序员宅基地

文章浏览阅读4.5k次。1. 下载impactor;地址:https://cydia.ooo/cydia-impactor/2. 下载Phoenix.ipa;3. 运行impactor ,安装Phoenix.ipa 到手机上;4. 运行Phoenix. 点击prepare for jailbreak. 然后点Accept. 接着点击Dismiss. 点击下面的Proceed with jai..._use privded iffsets

高并发下接口幂等性解决方案_高并发接口-程序员宅基地

文章浏览阅读303次。现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能在服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果是否要统一呢?那是肯定的!尤其在支付场景。_高并发接口

hadoop mysql中文乱码_Hive元数据存于mysql中文乱码解决-程序员宅基地

文章浏览阅读144次。最近在搭一套Hive测试环境,使用mysql存储hive的元数据,然而当执行一个带有中文注释的建表文件时,出现了中文乱码的问题。实验过程中发现把整个数据库编码改成latin1或者Utf8都不行,只有把整个数据库设定为latin1而把要存储中文的数据表的编码设定为UTF8才能够解决。出现问题:执行hive -f "createtable.sql"时说中文乱码不认识。尝试1失败:将meta datab..._create database hadoop_test character set utf-8;为什么会报错?

mysql开启日志占cpu不_MySQL占用CPU过高 查找原因及解决 多种方式-程序员宅基地

文章浏览阅读810次。MySQL占用CPU过高 查找原因及解决 多种方式一、排查有没有地方占用SQL资源过多1、排查方法:>mysql-uroot-p#登陆数据库>********#输入数据库密码2、查看数据库show databases;3、use 数据库名; #切换到常用数据库4、show processlist; #显..._打印mysql日志占用cpu吗