mybatis有两种缓存,一级缓存,二级缓存。
1、一级
一级缓存存在于sqlSession对象的生命周期中,伴随着对象的产生,自动生效,伴随着对象的关闭,自动清除。
同一个sqlSession的XXMapper接口,它执行更新,删除,插入都会刷新缓存。
一级缓存只适用于查询语句,若需关闭,在select配置flushCache为true即可。
2、二级
二级缓存的定义,操作(开启,配置,关闭),FAQ。
二级缓存存在于sqlSessionFactory对象的生命周期中,以Mapper的NameSpace缓存其查询结果,Statement语句等等。
2.1 操作
开启:在配置文件中设置cacheEnabled为true,并在XXMapper.xml中添加cache标签,配置它的属性。
配置:示例:<cache eviction="LRU" size="3" flushInterval="60*1000" readOnly="true"/>
- eviction:回收策略算法,支持LRU, FIFO, SOFT, WEAK。SOFT, WEAK是指Java的软引用和弱引用回收。
- flushInterval:缓存的刷新间隔,单位为毫秒。任何修改操作都会刷新缓存。
- size:缓存的引用个数,默认为1024。
- readonly:缓存是否持久化,若为true,则在内存中,以Map对象存在。若为false, 需要实现序列化接口。
关闭:默认未开启,设置cacheEnable为false即可。
2.2 FAQ
脏数据
当查询结果集为多个表的数据时,结果集需要映射为多个实体类型,例如用户对象中存在多个角色,需要返回List<Role>时。此时User对应UserMapper的命名空间,Role对应RoleMapper的命名空间,如果select语句存在与UserMapper命名空间下时,对RoleMapper命名空间下的增,删,改会导致UserMapper查询得到的Role不是最新的,此时User对应的List<Role>为脏数据。
处理这种情况需要在UserMapper中配置<cache-ref namespace=”roleMapper的命名空间”>,当进行Role的修改时,也会同步刷新UserMapper的缓存。