MyBatis缓存分为一级缓存和二级缓存
MyBatis缓存分为一级缓存和二级缓存
一级缓存
基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。(跟mysql缓存一样,修改任何参数的值都会导致缓存失效)
二级缓存
二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。作用域为 namespance。是指对该 namespance 对应的配置文件中所有的 select 操作结果都缓存,这样不同线程之间就可以共用二级缓存。
启动二级缓存
mybatis的配置文件开启:
以及在相应的Mapper文件(例如userMapper.xml)里开启
|
|
二级缓存可以设置返回的缓存对象策略:
当readOnly=”true”时,表示二级缓存返
回给所有调用者同一个缓存对象实例,调用者可以 update 获取的缓存实例,但是这样可能会造成其他调用者出现数
据不一致的情况(因为所有调用者调用的是同一个实例)。
当 readOnly=”false”时,返回给调用者的是二级缓存总缓
存对象的拷贝,即不同调用者获取的是缓存对象不同的实例,这样调用者对各自的缓存对象的修改不会影响到其他的
调用者,即是安全的,所以默认是 readOnly=”false”。
对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
参考
http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html