Mybatis缓存机制
介绍
和大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持。
备注:
所谓的缓存都是只针对查询而言的,这点千万要弄清楚否则就闹笑话了。
一级缓存
mybatis框架中的一级缓存是SqlSession会话级别缓存,是使用HashMap本地缓存实现的,只对当前打开的SqlSession对象有效,当sqlSession关闭或刷新缓存后缓存会失效。
一级缓存
基于HashMap实现的PerpetualCache本地缓存,其存储作用域为 Session,当
Session 使用flush 或 close 方法之后,该Session中的所有 Cache 就将清空。
缓存有效前提
1、同一个打开的SqlSession对象
2、查询语句和查询条件(入参)都是相同的
使缓存失效方式
1、调用sqlSession flush()方法
2、关闭sqlSession 对象 close()方法
3、同个sqlSession执行更新(CUD)操作
二级缓存
二级缓存
二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存
储,不同在于其存储作用域为 Mapper(Namespace即映射器),并且可自定义存储源,如 Ehcache...
二级缓存cache配置
在对应的映射器文件中配置
<cache
blocking=""
eviction="LRU" //缓存策略
flushInterval="" //自动刷新缓存时间
readOnly="" //只读
size=""//缓存大小
type=""//指定使用缓存类型,可以指定外部缓存如Ehcache...
>
</cache>
备注:
二级缓存可以那么理解,由于一级缓存不同SqlSession对象无法共享缓存对象,
二级缓存可以让不同SqlSession对象共享缓存对象。
备注说明
对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)
的进行了 更新操作(C/U/D) 操作后,默认该作用域下所有 select 中的缓存将被clear。
参考
http://blog.youkuaiyun.com/luanlouis/article/details/41390801
http://www.cnblogs.com/yjmyzz/p/use-cache-in-mybatis.html
https://en.wikipedia.org/wiki/Cache_(computing)
http://blog.jobbole.com/30940/