MyBatis-开启缓存

一、一级缓存:算法

  MyBatis默认开启了一级缓存,一级缓存是在sqlSession层面进行缓存的。 即同一个SqlSession屡次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,而后把数据缓存到缓冲中,之后直接从缓存中直接取出,不会直接查询数据库。
sql

  可是不一样的SqlSession对象,由于不一样的SqlSession都是相互隔离的,因此相同的Mapper、参数和方法,它仍是会再次发送。数据库

 

二、二级缓存:缓存

  为了克服一级缓存不一样SqlSession对象引起的问题,须要开启二级缓存。二级缓存是缓存的zaiSqlSessionFactory层m面给各个SqlSession对象共享。默认二级缓存是不开启的,须要手动开启。安全

  2.1 、开启二级缓存的配置:app

    在xx-mapper.xml文件中配置:性能

<!-- 开启二级缓存(默认参数) -->
<cache/>

    默认的参数属性:spa

      • 映射文件的全部的 select、insert、update和delete语句会刷新缓存
      • 缓存会使用默认的 Least Recently Used(LRU,最近最少使用原则)的算法回收缓存空间
      • 根据时间表,好比 No Flush Interval,(CNFI,没有刷新间隔),缓存不会以任什么时候间顺序来刷新
      • 缓存会存储列表集合或对象(不管查询方法还回什么)的1024个引用
      • 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索是不共享的,并且能够很安全的被调用者修改,不干扰其它调用者调用或现成的潜在修改。  

    自定义二级缓存参数:code

<!-- 开启二级缓存 -->
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>

     二级缓存的各个参数属性:xml

      • eviction:缓存回收策略:   

           - LRU:最少使用原则,移除最长时间不用的对象

           - FIFO:先进先出原则,按照对象进入缓存的顺序进行回收

           - SOFT:软引用,移除基以垃圾回收器和软引用规则的对象

           - WEAK:弱引用,更积极的移除基以垃圾回收器和软引用规则的对象

      • flushInterval:刷新时间间隔,单位为毫秒。若是不配置,那么只进行数据可修改操做才会被动刷新缓存区
      • size:引用额数目,表明缓存的最多能够存储的对象个数
      • readOnly:是否可读,若是为true,则全部的sql语句还回同一个对象(有助于提升性能,但操做同一条数据时,可能不安全),若是是false,则相同的SQL语句后面访问cache的clone副本

      能够在Mapper的具备方法下设置对二级缓存的访问意愿:

      • userCache配置:

          若是一条语句每次都须要最新的数据,就意味着每次都须要从数据库查询数据,能够把这个属性设置为false,如:

<select id="selectAll" resultMap="BaseResultMap" useCache="false">
      • flushCache刷新缓存(就是清空缓存)

           二级缓存默认会在insert、update、delete操做后刷新缓存,能够手动配置不更新缓存,以下:

<update id="updateById" parameterType="User" flushCache="false" />
相关文章
相关标签/搜索