MyBatis多级缓存(一级缓存/二级缓存)
2021-03-11 17:28:11 0 举报
AI智能生成
MyBatis多级缓存(一级缓存/二级缓存)
作者其他创作
大纲/内容
微信扫一扫关注公众号喜欢收藏+点赞👍 谢谢
一级缓存
一级缓存默认开启,默认缓存策略是LRU,也可以修改为FIFO(先进先出)
一级缓存是sqlSession会话级别的缓存,MyBatis会在SqlSession对象中建立一个简单的缓存,将每次查询的结果缓存起来,当下次遇到相同查询的时候,会直接从缓存中取出给用户,不需要再进行一次数据库查询
工作原理
第一次查询结果换以key value的形式存起来,如果有相同的key进来,直接返回value,减轻数据库压力
当commit或者rollback的时候会清除缓存,并且当执行insert、update、delete的时候也会清除缓存
Spring中Mybatis的一级缓存失效
Spring把sqlSession封装起来了,每次执行完都会关闭,下次执行再打开
二级缓存
二级缓存需要手动开启,属于Namespace 应用级别的缓存
开启
通过注解开启
@CacheNamespace
通过xml开启
<settings> <setting name=\"cacheEnabled\" value=\"true\"/></settings>
使用
在需要使用二级缓存的Mapper.xml文件中添加cache标签:<cache/>
二级缓存的自定义配置
type:cache使用的类型,默认是PerpetualCacheeviction:定义回收的策略,常见的有FIFO,LRUflushInterval:配置一定时间自动刷新缓存size:最多缓存对象的个数readOnly:是否只读,若配置可读写,则需要对应的实体类能够序列化blocking:配置若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存
二级缓存的坑?
对多表查询有局限性,容易出现读到脏数据。建议使用第三方缓存实现
比如其他namespace对该表有修改时不会触发缓存更新,下次读取时就会读到脏数据
如何避免?
在同一个namespace对该表进行修改,如果其他表也可能有修改则不要用二级缓存
0 条评论
回复 删除
下一页