mybatis-一级缓存&二级缓存
缓存
缓存分为一级缓存和二级缓存,

一级缓存
一级缓存默认是开启状态 ,只在当前sqlsession内共享 ,当有query动作时,会存储在executor中的hashmap中,
当有更新操作(注意是更新操作 ,不需要命中cacke的key,cachekey只是用作查询。因为语句是手写的,所以更新语句和查询语句对数据的影响,框架没办法知道),或者sqlsession关闭时,才直接清空缓存。
一级缓存是粗粒度的缓存 ,没有容量,过期时间的约束。

query

key的值

修改: 修改操作,最后都需要commit(不管是自动还是手动),数据库提交之前,会清空该sqlsession中所有的一级缓存。



二级缓存
二级缓存默认不开启,需要配置才生效。 也可以配置外部存储,比如redis。 开启二级缓存之后,就可以在sqlsession之间共享缓存。
自带的二级缓存也是hashmap,也是没有容量,过期时间等控制。
注意,只有sqlsession commit或者close之后, 查询结果才会存储到二级缓存中去。
自带的二级缓存存在的问题
- 底层是hashmap,只在单个进程中有效, 多实例中无法共享。
- 注意与该数据相关的update要写在一个namespace中, 不然就不会更新缓存(不断问题,但是一二级缓存都需要注意,乱写位置的话, 容易出现脏数据)
- 没有过期时间和容量控制(一级缓存时, session当close时会清空缓存 , 但是二级缓存,如果一直是各种查询, 那么缓存就一直存在)


mybatis官方已经有redis作为二级缓存的实现, 直接引入jar, 然后进行配置即可
redis使用的结构是hash

开启二级缓存需要配置三个开关,只有第二个开关需要主动配置,其他两处默认都是开启状态


浙公网安备 33010602011771号