Mybatis:一级缓存和二级缓存

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-06 01:46:46

缓存Cache

概述 存在于内存中的临时数据
作用 减少和数据库的交互次数,提高执行效率
适用场景 经常查询并且不经常改变的;数据的正确与否对最终结果影响不大的。(数据的有效性和实时性)
不适用 经常改变的数据;数据的正确与否对最终结果影响很大的

一级缓存

Mybatis 使用到了两种缓存:本地缓存(local cache)和二级缓存(second level cache),但是在没有配置的默认情况下,它只开启一级缓存。每当一个新 session 被创建,MyBatis 就会创建一个与之相关联的本地缓存。任何在 session 执行过的查询语句本身都会被保存在本地缓存中,那么,相同的查询语句和相同的参数所产生的更改就不会二度影响数据库了。本地缓存会被增删改、提交事务、关闭事务以及关闭 session 所清空。
在这里插入图片描述

  • 一级缓存:指的是Mybatis中SqlSession对象的缓存

  • 作用域:SqlSession范围,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

  • 不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

  • 如何会重新提交数据?:

  1. 关闭SqlSession对象close();如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用
  2. 手动清空缓存clearCache();如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用
  3. SqlSession中执行了任何一个更新数据的操作(update()、delete()、insert()) ,都会清空缓存的数据,但是该对象可以继续使用

二级缓存

SqlSessionFactory层面上的二级缓存默认是不开启的,实现二级缓存的时候,MyBatis要求返回的实体类必须是可序列化的,且不同的session使用后要释放;
在这里插入图片描述

  • 二级缓存指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。

  • 作用域:mapper的同一个namespace;二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

  • 开启缓存步骤:

  1. 全局配置:
<!--配置二级缓存-->
<setting name="cacheEnabled" value="true"></setting>
  1. 局部配置:
<!--mapper中配置缓存-->
<cache></cache>
  1. 标签使用:mybatis中还可以配置userCache和flushCache等配置项,userCache是用来设置是否禁用二级缓存的,在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存
<select id="findById" resultType="user" useCache="true">
   select * from user where id = #{id}
</select>
  • 在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
    设置statement配置中的flushCache=”true” 属性,默认情况下为true,即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。
  • 使用:对于查询多commit少且用户对查询结果实时性要求不高,此时采用mybatis二级缓存技术降低数据库访问量,提高访问速度。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!