参考书目:《mybatis从入门到精通》 刘增辉  著

作者GitHub:https://github.com/abel533/MyBatis-Spring-Boot

一级缓存

mybatis的一级缓存存在于SqlSession的生命周期中,在同一个SqlSession中查询时,mybatis会把执行的方法和参数生成缓存的键值,将键值和查询结果存入一个Map对象中。如果同一个SqlSession中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中已存在该键值时,则会返回缓存中的对象。

因此,一般在对数据库进行更新操作后需要清空缓存,而查询操作之后一般不要清空缓存,否则会降低查询性能。

mybatis通过在Mapper.xml中接口的实现中添加属性flushCache="true"来实现清空一级缓存。

完整示例如下:

<select id ="selectById" flushCache="true" resultMap = "userMap">select * from user where id = #{id}
</select>

二级缓存

不同于一级缓存只存在于SqlSession生命周期中,而是存在于SqlSessionFactory的生命周期中。当存在多个SqlSessionFactory时,它们的缓存都是绑定在各自对象上的,缓存数据都是绑定在各自对象上,缓存数据一般情况下是不相通的。只有在使用如Redis这样的缓存数据库时,才可以共享缓存。

mybatis默认开启二级缓存,因此无需设置,如果要关闭二级缓存,可以在mybatis的配置文件中将

<setting name = "cacheEnabled" value="false">  该值默认为true,也就是开启二级换窜。

如果使用可读写缓存,可以使用SerializedCache序列化缓存。这个缓存类要求所有被序列化的对象必须实现Serializable接口,所以需要将实体类修改为实现了该接口的类。

同样也可以使用EnCache和Redis实现二级缓存。

脏数据的产生和避免

二级缓存虽然能提高效率,减轻数据库服务器的压力,但是如果使用不当很容易产生脏数据。

mybatis的二级缓存是和命名空间绑定的,所以通常情况下一个Mapper映射文件都拥有自己的二级缓存,不同Mapper的二级缓存互不影响。关系型数据库常会用到多表联合查询。在关联多表查询时肯定会将该查询放到某个命名空间下的映射文件中,这样一个多表的查询就会缓存在该命名空间下的二级缓存中。涉及这些表的增删改查操作通常不在一个映射文件中,因此在其他命名空间下的二级缓存发生改变时,多表查询的二级缓存可能并没有改变,就会发生脏读。

如何避免出现脏读?

需要借助参照缓存,当某几个表可以作为一个业务整体时,通常是让几个会关联的ER表同时使用同一个二级缓存,这样就能解决脏数据问题。

示例如下:

<mapper namespace="UserMapper"><cache-ref namespace="RoleMapper"/><!--其他配置-->
</mapper>

二级缓存适用场景:

  • 以查询为主的应用中,只有尽可能少的增删改操作
  • 绝大多数以表单操作存在时,由于很少存在互相关联的情况,因此不会出现脏数据。
  • 可以按业务划分对表进行分组时,如关联表比较少,可以通过参照缓存设置。
  • 如果脏读对系统无影响,也可以考虑使用。
  • 在无法保证数据不出现脏读的情况下,建议在业务层使用可控制的缓存代替二级缓存。

mybatis一级缓存、二级缓存以及集成EnCache、Redis,避免脏读相关推荐

  1. Mybatis3.4.x技术内幕(二十二):Mybatis一级、二级缓存原理分析

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis的一级缓存,指的是SqlSession级别的缓存,默认开启:Mybatis的二级缓存,指的是SqlSession ...

  2. mybatis一级,二级缓存。缓存带来的脏读问题

    title 1. 关于缓存的介绍 2. 一级缓存,默认开启,session级别 3. 二级缓存,mapper 的namespace级别 1. 关于缓存的介绍 Mybatis一级缓存的作用域是同一个Sq ...

  3. MyBatis 一级缓存二级缓存详解

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...

  4. 深入浅出 MyBatis 的一级、二级缓存机制

    一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...

  5. mybatis教程--查询缓存(一级缓存二级缓存和整合ehcache)

    查询缓存 1 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2 mybat ...

  6. 【mybatis】Mybatis中的一级、二级缓存

    [mybatis]简介 [mybatis]mybatis & mybatis-plus & hibernate的区别 [mybatis]核心成员分析 [mybatis]Mybatis的 ...

  7. 【MyBatis学习13】MyBatis中的二级缓存

    1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加 ...

  8. MyBatis中的二级缓存

    MyBatis中的二级缓存 1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二 ...

  9. MyBatis学习系列——二级缓存

    [MyBatis学习13]MyBatis中的二级缓存 发表于2016/6/16 7:26:19  4922人阅读 分类: ● 框架技术 --[MyBatis] 1. 二级缓存的原理 前面介绍了,myb ...

  10. 【MyBatis学习8】MyBatis中的二级缓存

    1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加 ...

最新文章

  1. 数据库结构Sqlite与CoreData
  2. 一个奇怪的生产环境配置ldap服务引起的故障及解决过程分享
  3. MySQL Cluster(MySQL 集群) 初试
  4. 遭遇ORA-01200错误的原因及解决方法
  5. 2021暑假生产实习【SSM实习项目-超市积分管理系统】博客汇总表
  6. mfc存储颜色到mysql_mfc存储二进制文件
  7. 判断三角形java代码_java基础编程题之异常处理
  8. 1779: 无法言表(map+queue)
  9. SpringCloud Eureka服务治理
  10. OpenWares | Open Source and Free Matters » 为rm命令增加回收站功能
  11. 编织让你受益一生的交际网
  12. php 漏洞扫描,Webvulscan:一款基于PHP的漏洞扫描器
  13. 经典r-k法 matlab,解微分方程欧拉法,R-K法及其MATLAB实例
  14. hdu 2665 Kth number(划分树模板)
  15. HTML中让整个效果居中,仅使用CSS做到完全居中的超级攻略
  16. 如何解除病毒对各种杀毒软件的劫持
  17. 论坛介绍|COSCon'22 人工智能(A)
  18. html输入框自动对齐,html如何设置文本框对齐
  19. Mobiola web camera Mobiola web camera
  20. 利用c++完成学生成绩管理系统

热门文章

  1. Unexpected exception parsing XML document from class path resource
  2. idea中vue文件 游览器图标_vue项目中icon图标的完美引入
  3. python人像绘制_CVPR 2019 | APDrawingGAN:人脸秒变艺术肖像画
  4. 第5-6周-实验作业-串口通信小试
  5. Python真香之爬取古诗文网
  6. 如何搭建自己的博客网站(手把手教你搭建免费个人博客网站)
  7. <Leetcode>算法初步(回顾)
  8. apache中的php模块安装
  9. Vue 键盘事件(keyup、keydown)
  10. shell中遍历字符串