MyBatis 二级缓存的开启与配置

mybatis一级缓存

mybatis一级缓存是默认开启的,是SqlSession级别的缓存,在操作数据库的时候需要创建一个SqlSession,其中有一个HashMap,用于存储缓存数据。不同的SqlSession之间,其缓存数据的HashMap是不同的;
所以当我们多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。但是不同的SqlSession对象,因为不用的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。所以我们需要根据需求开启二级缓存

mybatis二级缓存

二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的SQL语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的。

  1. 首先在mybatis配置文件的节点中配置整体开启二级缓存。
<settings>
	<!-- 开启日志 -->
	<setting name="logImpl" value="STDOUT_LOGGING"/>
	<!-- 开启二级缓存(整体开启) -->
	<setting name="cacheEnabled" value="true"/>
</settings>
  1. 然后为具体的Mapper映射文件的命名空间进行二级缓存的具体配置。
<!-- cacahe节点:配置当前命名空间下mapper的缓存 -->
<cache eviction= "LRU" flushInterval= "100000" readOnly= "true" size= "1024"/>
  • eviction代表缓存回收策略,目前mybatis提供以下回收策略:
    • LRU(Least Recently Used):最近最少使用的,回收最长时间不用的对象;
    • FIFO(First in first out):先进先出,按照对象进入缓存的顺序来移除;
    • SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象;
    • WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。
  • flushInterval:缓存刷新时间间隔,单位为毫秒,每经过相应时间会对缓存进行刷新,如果没有配置,当SQL被执行的时候才会刷新缓存。
  • readOnly:只读,设置只读为“true”意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是没有办法修改缓存,它的默认值是false,不允许修改。
  • size:引用数目,是一个整数,代表缓存最多可以存储多少的对象,该数据不宜设置过大,如果设置过大会导致内存溢出。
  1. 使缓存对象的实体类实现序列化接口(Serializable),使其能够被序列化和反序列化。
    由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,实现序列化接口的目是二级缓存可能会使用硬盘临时存储,所以要实现序列化接口保证对象能够被序列化和反序列化。

只有当一级缓存,SqlSession对象使用完毕后能够关闭时,二级缓存才能正常命中,否则将会出现缓存命中为零的现象。

mybatis解读

  1. 开启缓存的弊端是数据没有实时性,当数据库中的数据一旦修改,查询的数据还是缓存中的数据没有实时性,对于某些需要实时性显示数据的接口我们可以设置 useCache="false" ,设置该属性后,该接口每次查询出来都是去执行sql查询出实时性数据。如:
<!-- 获取文章浏览量 -->
<select id="findArtPageview" parameterType="com.Article" resultType="int" useCache="false">
select pageview from article where aid=#{aid}
</select>
  1. 清空缓存,一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。但是如果你不想刷新缓存只需要这么做:
<update id="pageviewAdd" parameterType="com.Goods" flushCache="false">
  update goods set pageview=#{pageview} where gid=#{gid}
</update>

          将flushCache=true改为flushCache=false就不用刷新了

总结

  1. 当为select语句时:

         flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。

         useCache默认为true,表示会将本条语句的结果进行二级缓存。

  1. 当为insert、update、delete语句时:

         flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。

         useCache属性在该情况下没有。

当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,所以,如果有必要,那么就需要人工修改配置。

posted @ 2022-05-12 20:43  CodingSh1t  阅读(2245)  评论(0编辑  收藏  举报