关于什么是缓存,为什么要有缓存之类的问题这里不做阐述,本文仅对mybatis缓存在实际中的应用进行分析。
1.一级缓存:本地缓存,sqlsession级别的一个缓存,基于map实现,是一直开启的
·一级缓存失效的四种情况:
|-sqlsession不同
|-sqlsession相同,语句不同
|-sqlsession相同,但是两次查询之间进行了增删改操作
|-sqlsession相同,但是中间手动清除了缓存sqlsession.clearCache();
2.二级缓存:全局缓存,基于namespace级别的缓存
·工作原理:一个会话查询一个数据,这个数据会被放在当前会话的一级缓存中,如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话信息会到二级缓存中查找信息,不同的namespace下的方法查出的数据会放在各自对应的缓存中
·使用:
|-开启全局二级缓存设置,settings中:
|-对应的mapper的namespace中配置cache
|-我们的POJO类必须实现序列化接口Serialize
二级缓存的常用参数:
1.eviction:缓冲的回收策略,默认是LRU
· LRU – 最近最少使用的:移除最长时间不被使用的对象。
·FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
·SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
·WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
2.flushInterval(刷新间隔):可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
3.size(引用数目):可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。
4.readOnly(只读):属性可以被设置为 true 或 false。只读(true)的缓存会给所有调用者返回缓存对象的引用。因此这些对象不能被修改。这提供了很重要的性能优势,但是不安全。可读写(false)的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全。默认是false。
5.type:指定自定义缓存的具体路径,实现Cache接口的类,第三方缓存整合mybatis就是实现这个接口
注意:
1.每个select上的useCache
属性影响的是二级缓存
2.每个增删改标签的flashCache
默认都是true,所以操作过后一级缓存和二级缓存都会清空;查询标签的flashCache
是默认是false,所以操作完成后不会清空缓存,若置为true则每次查询后会清空缓存,即不使用缓存
3.clearCache()
方法影响的是一级缓存
3.使用第三方缓存框架,以redis作为mybatis的二级缓存为例:
·下载对应的包,https://github.com/mybatis 下有各种缓存整合包,对应各自依赖
·找到对应的redis的maven依赖
·在需要使用二级缓存的namespace中指定缓存的类型:
<cache type="org.mybatis.caches.redis.RedisCache" />
·开启redis服务器端,执行操作