Mybatis之一级缓存与二级缓存

前言 面试官:你简历上写了了解mybatis缓存,那你能说说一级缓存和二级缓存的区别吗? 你:我只知道这是用来缓存sql查询的数据 面试官:没了? 你:没了 面试官:公司门知道在哪里吧 自己走还是我...

    前言

    面试官:你简历上写了了解mybatis缓存,那你能说说一级缓存和二级缓存的区别吗?

    你:我只知道这是用来缓存sql查询的数据

    面试官:没了?

    你:没了

    面试官:公司门知道在哪里吧自己走还是我送你

    以上是真实的面试经历于是恶补一下Mybatis缓存机制的知识真的势在必行!

    Mybatis的缓存,包括一级缓存和二级缓存

    Mybatis对缓存提供支持,一级缓存是默认使用的

attachments-2020-08-3OzPKUB05f3b74fbc7e53.jpg

    二级缓存需要手动开启

    区别:一级缓存的作用域是一个sqlsession内;二级缓存作用域是针对mapper进行缓存.

    一级缓存:

    在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

    一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)。

    二级缓存:

    二级缓存指的就是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句、条件、statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。

    1、在配置文件中开启二级缓存的总开关

    <settingname="cacheEnabled"value="true"/>

    2、在mapper映射文件中开启二级缓存

    <cacheeviction="FIFO"flushInterval="60000"size="512"

    readOnly="true"/>

    eviction收回策略

    flushInterval刷新间隔

    size引用数目

    readOnly只读

    关于eviction的各个参数属性:

    eviction="LRU"最近最少使用的:移除最长时间不被使用的对象。(默认)

    eviction="FIFO"先进先出:按对象进入缓存的顺序来移除它们。

    eviction="SOFT"软引用:移除基于垃圾回收器状态和软引用规则的对象。

    eviction="WEAK"弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

    3、实体类实现Serializable

    禁用缓存

    如测试sql语句性能时缓存会影响测试准确性需要禁用

    在映射文件中:

    默认值是trueuseCache=”false”

    <selectid="findAllPets"resultMap="petsMap"useCache="false">

    select*frompets

    </select>

    刷新缓存

    在映射文件中:

    属性:flushCache=”true”

    刷新缓存,在查询语句中,默认值是false,在新增删除修改语句中,默认值是true(清空缓存)

推荐阅读:java架构师指南之什么是架构和架构本质

  • 发表于 2020-07-10 15:33
  • 阅读 ( 274 )
  • 分类:技术干货

0 条评论

请先 登录 后评论
JAVA Q&A
JAVA Q&A

173 篇文章

作家榜 »

  1. JAVA Q&A 173 文章
  2. 江南 1 文章
  3. 伯乐 0 文章
  4. 孤存 0 文章
  5. q21164340 0 文章
  6. 赫敏12 0 文章
  7. 子牙 0 文章
  8. 赫敏 0 文章