【Mybatis】一级缓存与二级缓存

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【Mybatis】一级缓存与二级缓存,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

闲话

Mybatis终于完结咯~~

基本要点

1、缓存

  • 什么是缓存?
    存在内存中的临时数据,我们可以把用户经常查询的数据存放到缓存中,当用户重复查询时,我们可以直接从缓存中查询,提高查询效率,可以解决高并发系统的性能问题

  • 为什么使用缓存?
    减少和数据库交互次数,减轻数据库的压力,提高系统效率

  • 什么样的数据能使用缓存?
    经常查询且不经常改变的数据

2、一级缓存(默认开启,无法关闭)

1)一级缓存的有效区间是sqlSession从创建到关闭的过程

假设我们重复执行同一条查询语句,如下图所示
我们可以看出,程序只会连接数据库查询一次,后面的查询结果都从缓存中取出
在这里插入图片描述

2)一级缓存失效的几种情况

  • 查询不同的东西(前后2次的查询不一样,会刷新缓存)
  • 执行insert、update 和 delete 语句后会刷新缓存(增删改操作可能会改变原来的数据,所以必定会刷新缓存)
  • 查询不同的Mapper.xml
  • 手动清除缓存,两次查询中间调用了sqlSession.clearCache()方法

3、二级缓存

1)定义

  • 二级缓存是基于namespace级别的缓存,可以理解为单个Mapper级别的缓存
    建议将SQL映射文件涉及到的实体类序列化,即实现Serializable接口,防止出现报错

2)工作机制

  • 所有的查询数据都会先放在一级缓存中
    当会话commit或者sqlSession关闭时,系统会把一级缓存中的数据传递到二级缓存中
  • 当xml文件再次被调用且执行相同的查询操作时,直接从Mapper的缓存中查
  • 不同的mapper查出的数据会放在自己对应的缓存中

3)开启步骤:

  • 首先去mybatis-config.xml中开启全局缓存
<settings>
    <setting name="cachaEnable" value="value"/>
</setting>
  • 在SQL映射文件文件中启用全局的二级缓存
    如下,我们创建了一个清除策略为 FIFO 的缓存,每隔 60 秒刷新
    最多可以存储结果对象或列表的 512 个引用,返回的对象被认为是只读的
    如果不需要参数,直接使用<cache/>即可
<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

4)缓存的几种清除策略(主要了解以下2种)

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

4、缓存查询原理

我们的查询请求会先去二级缓存中查看有没有数据
如果没有,就会去一级缓存中查有没有
如果都没有,再连接数据库查询

如有错误,欢迎指正!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/136770.html

(0)

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!