mybatis的缓存

  MyBatis缓存分为一级缓存和二级缓存

MyBatis缓存分为一级缓存和二级缓存

一级缓存

基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。(跟mysql缓存一样,修改任何参数的值都会导致缓存失效)

二级缓存

二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。作用域为 namespance。是指对该 namespance 对应的配置文件中所有的 select 操作结果都缓存,这样不同线程之间就可以共用二级缓存。

启动二级缓存

mybatis的配置文件开启:

1
<setting name="cacheEnabled" value="true"/>。

以及在相应的Mapper文件(例如userMapper.xml)里开启

1
2
3
4
5
6
7
8
9
<mapper namespace="dao.userdao">
... select statement ...
<!-- Cache 配置 -->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true" />
</mapper>

二级缓存可以设置返回的缓存对象策略:

当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

文章目录
  1. 1. 一级缓存
  2. 2. 二级缓存
    1. 2.1. 启动二级缓存
  3. 3. 参考
|