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的时候,首先它会在自己的一级缓存里面找,如果找不到,那就去二级缓存里面找
找到了就不用去查询数据库,从而减少了数据库的压力,提高了查询速度。
这个二级缓存清空也和一级缓存一样,如果有操作数据库,那么会清空缓存的,防止数据不一致。
以上。