一、MyBatis缓存介
正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持
1.一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
二、一级缓存
一级缓存存在于sqlsession的生命周期中,在同一个sqlsession中查询时,mybatis会把查询方法和参数通过算法生成缓存的主键值,把主键和查询结果存放到map中。如果同一个sqlsession中执行的执行方法和参数完全一致。那么会通过算法返回相同的对象。insert、update、delete操作都会清空一级缓存。
一级缓存默认是开启的,如果先取消select 的一级缓存,在selete配置中配置属性flushCache="ture"。
<select id="selectAllCity" flushCache="true" resultMap="cityResultMapper">
三、二级缓存
二级缓存不同于一级缓存的是存在的生命周期是同一个SqlSessionFactory。 二级缓存是mapper级别的缓存,值得注意的是,不同的mapper通常情况下有不同的namespace,就都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的。 二级缓存配置,默认是开启的, 在主配置文件中添加 在setings中增加如下配置关闭二级缓存。<seting name="cacheEnabled" value="false">
在XxxMapper.xml文件中配置二级缓存策略
<cache eviction="FIFO" flushInterval="60000"readOnly="true" size="512"/>
eviction:缓存策略FIFO:First In First Out ,LRU:Least Recently Used
flushInterval:缓存刷新时间间隔,时间是毫秒,检查是否存在过期对象
size:缓存中存储的对象个数
readOnly:是否只读
myabatis二级缓存脏数据产生的原因。如果是多变关联的查询语句,如果表中的数据如果是在其他mapper文件中多表中的数据进行增删改,不会刷新缓存,因为二级缓存和命名空间绑定的。解决办法是几个会关联的表用使用同一一个二级缓存。