缓存

mybatis的缓存分为一级缓存跟为二级缓存

一级缓存

一级缓存是sqlSession级别的缓存,就是sqlSession级别的一个map。一级缓存是一直开启的,也就是说每一个sqlSession对象都有自己的一级缓存,两个一级缓存之间不能共用

一级缓存又称本地缓存,与数据库同一次会话期间查询到的数据会放到本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去数据库

一级缓存失效的情况(没有使用到当前一级缓存的情况,效果就是还需要向数据库发出查询)

  1. sqlSession不同,一级缓存会失效
  2. sqlSession相同,查询条件不同(因为当前缓存中还没有这个数据)
  3. sqlSession相同,两次查询之间执行了增删改操作(因为这次增删改可能会对当前数据有影响)
  4. sqlSession相同,手动清除了一级缓存(缓存清空,没有数据) 使用session.clearCache();

二级缓存

又称全局缓存,基于namespace级别的缓存,一个xml文件的namespace对应一个二级缓存

工作机制:

  • 一个会话,查询一条数据,这个数据就会被放到当前会话的一级缓存中
  • 如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话查询信息,就可以参照二级缓存

使用

  1. 开启全局二级缓存配置 <setting name=”cacheEnabled” value=”true” />
  2. mapper.xml文件中配置使用二级缓存  <cache eviction=”” flushInterval=”” readOnly=”” size=”” type=””></cache>

    属性说明:

      (1) eviction:缓存的回收策略

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

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

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

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

      (2) flushInterval:缓存刷新间隔,即缓存多长时间清空一次,默认不清空,可以设置一个毫秒值

      (3) readOnly:缓存是否只读

        ① true:只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据,为了加快速度,mybatis会直接将数据在缓存中的引用交给用户。这样做不安全,但是速度快

        ② false(默认):非只读,mybatis会利用序列化&反序列化的技术克隆一份新的数据给用户,安全,但是速度慢

      (4) size:缓存的大小

      (5) type:自定义缓存时,指定自定义缓存的全类名,实现Cache即可自定义缓存

  3. 我们定义的POJO需要实现序列化接口Serializable

缓存相关的设置以及属性

  • cacheEnable=true, false:关闭缓存(二级缓存关闭)(一级缓存仍然可用)
  • <select useCache=”true”></select>:每个select标签都有useCache属性,为false时关闭二级缓存,一级缓存仍然可用
  • flushCache=”true”:每个增删改标签都有这个属性,默认是true,也就是增删改执行后就会清空缓存,一二级缓存都会被清空。查询标签中也有这个属性,但是默认是false
  • sqlSession.clearCache():只清除当前session的一级缓存
  • localCacheScope:本地缓存作用域(一级缓存)
  • 缓存的使用顺序,先看二级缓存,再看一级缓存,如果都没有再去数据库

 

posted @ 2018-11-11 18:53  Jin同学  阅读(160)  评论(0)    收藏  举报