mybatis缓存机制
摘自《Spring+Mybatis企业应用实战》
mybatis的查询分为一级缓存和二级缓存
- 一级缓存是SqlSession级别的缓存
- 二级缓存是mapper级别的缓存,二级缓存是多个SqlSession共享的
一级缓存(SqlSession级别)
一级缓存是SqlSession级别的缓存。mybatis使用hashMap作为存储缓存数据,使用id作为key。不同sqlSession之间缓存数据区域(HashMap)是相互不影响的。如果SqlSessioin执行DML操作(insert,update和delete),并提交到数据库,mybatis会清空SqlSession中的一级缓存。这样做的目的就是为了保证缓存中存储的是最新的数据,避免出现脏读的现象。mybatis默认开启一级缓存。
*使用id作为key,形如:
-1932640473:4314250821:com.github.xxx.dao.CountryDao.getById:0:2147483647:SELECT * FROM country WHERE country_id = ?:1:SqlSessionFactoryBean
*
<setting name="localCacheScope" value="SESSION"/>
二级缓存(mapper级别)
mybatis二级缓存是mapper级别的缓存。二级缓存同样是基于HashMap进行缓存数据。二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace。mybatis默认没有开启二级缓存,需要在全局参数中开启二级缓存:
<!-- false 代表禁用二级缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 使用cashe -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
cache中的属性:
- flushInterval: 刷新间隔。毫秒数,默认是不设置,也就是没有刷新时间
- size: 缓存对象的数目。默认是1024
- readOnly: 只读。默认是false,只读的缓存意味着返回的对象不能被修改
- eviction: 回收策略,默认是LRU
- LRU: 最近最少使用,移除最长时间不被使用的对象
- FIFO:先进先出,按对象进入缓存的顺序来移除
- SOFT: 软引用策略,移除基于垃圾回收器状态各软引用规则的对象
- WEAk: 弱引用策略,更积极移除基于垃圾回收器状态和弱引用规则的对象
使用二级缓存的时候,查询结果映射的java对象需要实现java.io.Serializable接口,因为二级缓存可以使用第三方缓存介质(如ehcache),不一定在内存,有可能在磁盘或者是服务器