Mybatis的一级二级缓存

Mybatis提供了缓存机制,可以减轻数据库的压力,提高性能

Mybatis的缓存分为两级:一个是一级缓存,一个二级缓存

一级缓存:即默认使用的缓存SqlSession级别的缓存,只在sqlsession内有效

二级缓存:mapper级别的缓存,同一个namespace公用一个缓存,所以对sqlsession是共享的

 

一级缓存:具体流程如下:

      1,第一次执行select的时候,会把查到的数据写入sqlsession里面的hashmap里面缓存起来

      2,然后第二次查询的时候,会从缓存中查数据,如果传入的参数相同,那么就直接从缓存中返回数据,而不去查数据库,因此提高了效率。

      但是要注意:当你去对数据库进行操作(inset,update,delete)的时候,会清空当前sqlsession里面的所有缓存,以此来保证数据库数据与缓存

      数据一致。当你执行cleanCach()这个方法的时候,也会清空缓存。

      顺便提一句,mybatis的缓存是基于【namespace:sql语句:参数】来进行缓存的,sqlsession用hashmap进行缓存的时候,是用

      【namespace:sql语句:参数】作为key,,查询返回的语句作为value保存的。

 

二级缓存:是mapper级别的缓存,也是就同一个namespace的mapper.xml,多个sqlsession使用同一个mapper操作数据的时候,得到的数据会

     缓存在同一个区域

     这个二级缓存是默认不开启的,因此要去设置一下

     如果不是用springboot,那需要在mybatis-config.xml配置文件里面加入这个设置:

     这个默认是false,所以开启一下 

<settings>
        <setting name="cacheEnabled" value="true"/>默认是false:关闭二级缓存
<settings>

     如果是springboot,则不用这个mybatis-config,xml也行

     在application.properties里面加上这一句:

#开启二级缓存
mybatis.configuration.cache-enabled=true

     也可以起到哦同样的作用

      最后也要在mapper.xml文件里面配置一下:

      加入<catch/>标签

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>当前mapper下所有语句开启二级缓存

   这里简单说一下eviction回收策略:有四个(默认是LRU)

                  1,LRU:用的最少的,长时间不用的去掉

                  2,FIFO:先进先出按进入缓存的顺序去掉

                  3,SOFT:基于垃圾回收状态和软引用规则

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

 

flushInterval:刷新时间,size:容量,readONly:只读(开启)

如此大体流程如下:
        1,当执行一次sqlsession的select的时候,在关闭sqlsession后会把查询结果存到二级缓存里面
        2,当另外一个sqlsession执行select的时候,首先它会在自己的一级缓存里面找,如果找不到,那就去二级缓存里面找
         找到了就不用去查询数据库,从而减少了数据库的压力,提高了查询速度。
    这个二级缓存清空也和一级缓存一样,如果有操作数据库,那么会清空缓存的,防止数据不一致。


以上。
posted @ 2018-11-06 17:39  hickup  阅读(141)  评论(0编辑  收藏  举报