mybatis的二级缓存


废弃

本文废弃,详见下面链接:

https://www.malaoshi.top/show_1IXPEuxjXC.html


二级缓存就是global caching,它超出session范围之外,可以被所有sqlSession共享
在mybatis的配置文件开启二级缓存:

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


在mapper文件中加入以下配置:

<cache />

关于的更多配置

<cache 
        eviction="LRU"
        flushInterval="60000"
        size="1024"
        readOnly="true"
    />

  

这里有几个要注意的地方:


eviction是缓存的淘汰算法,可选值有

  • "LRU":最近最少使用的:移除最长时间不被使用的对象

  • "FIFO":先进先出:按对象进入缓存的顺序来移除它们

  • "SOFT":软引用:移除基于垃圾回收器状态和软引用规则的对象

  • "WEAK": 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
    缺省值是LRU


flashInterval指缓存过期时间,单位为毫秒,60000即为60秒,缺省值为空,即只要容量足够,永不过期


size指缓存多少个对象,默认值为1024


readOnly是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),如果设置为false,则相同的sql,后面访问的是cache的clone副本。


需要注意的是global caching的作用域是针对Mapper的Namespace而言的,也就是说只在有在这个Namespace内的查询才能共享这个cache


---------------------------------------------------------------

<select  ...   userCache="false">

useCache属性,默认为true,即开启二级缓存。通过该属性可以局部控制,比如设置userCache="false"禁用二级缓存

useCache="false"表示该select语句不使用缓存(即使xml最开头的全局cache启用)


---------------------------------------------------------------


默认情况下,如果全局开启了缓存,insert/update/delete成功后,会自动刷新相关的缓存项

flushCache属性,默认为true
(1)当为select语句时:

flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
(2)当为insert、update、delete语句时:

flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。

<insert  ...    flushCache='true'>

一般执行inser操作时,需要刷新缓存,否则会新插入的数据查询不出来。

二级缓存的危害,参看以下文章:

http://blog.csdn.net/isea533/article/details/44566257


参考文章,非常感谢:

http://www.cnblogs.com/QQParadise/articles/5109633.html
http://blog.csdn.net/lycemail/article/details/50923245
http://www.360doc.com/content/15/1205/07/29475794_518018352.shtml



原文出处:/show_1C71IZqyoKG1.html