mybatis缓存机制
1.一级缓存(本地缓存 sqlsession):即 session 级别的缓存,非全局缓存,或者非二级缓存.
a.在默认情况下是开启一级缓存的
b.一级缓存失效的情况
i.在同一sqlsession中,方法相同,但是传入的实参不一致也会导致一级失效
ii.sqlsession不相同,也会导致一级缓存失效
iii.在sqlsession中,执行update/insert/delete都会导致一级缓存失效
2.二级缓存(sqlsessionFactory):它是基于namespace级别的,每一个namespace都会对应到一个二级缓存。
实现方式:
a.在mapper标签直接引入<cache></cache>
b.采用三方 cache 框架, 比如ehcache, oscache 等等.
详解:
eviction:设置缓存的回收策略。默认LRU
• LRU – Least Recently Used: Removes objects that haven't been used for the longst period of time.
最近最少使用的对象:移除长时间未被使用的对象。
• FIFO – First In First Out: Removes objects in the order that they entered the cache.
先进先出:按照进入缓存的顺序来移除对象。
• SOFT – Soft Reference: Removes objects based on the garbage collector state and the rules of Soft References.
软引用:根据垃圾回收期和软引用规则来移除对象。
• WEAK – Weak Reference: More aggressively removes objects based on the garbage collector state and rules of Weak References.
弱引用:根据垃圾回收期和弱引用规则来移除对象。
flushInterval:刷新时间间隔
1.设置为正整数,且以毫秒为单位
2.默认情况下没有设置,不清空缓存
size:表示缓存引用数量,默认情况是1024引用。
type:指定自定义缓存的全类名。(较少使用)
readOnly:是否只读
-true:mybatis认为所有从缓存中获取数据的操作都是只读操作,而且还不修改数据。
mybatis直接从缓存中将数据的引用交给用户,虽然速度快,但是不安全。
-false:读写。mybatis认为数据可能会被修改。
mybatis使用序列化与反序列化的机制,复制了一份新的数据给用户。安全,速度慢。
代码:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
1.所有在映射文件里的 select 语句都将被缓存。
2.所有在映射文件里 insert,update 和 delete 语句会清空缓存。
3.缓存使用“最近很少使用”算法来回收
4.缓存不会被设定的时间所清空。
5.每个缓存可以存储 1024 个列表或对象的引用(不管查询出来的结果是什么) 。
6.缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。
缓存元素的所有特性都可以通过属性来修改。比如:程序代码
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
这里cacheEnabled 写不写都没所谓,因为默认是true
运行结果