Mybatis分为一二级缓存
一级缓存在SqlSession上 (默认情况下开启,这一级的缓存不需要POJO对象可序列化)
二级缓存在SqlSessionFactory上
一级缓存:
( 需要提交才能 ) 当代码对同一个对象进行两次获取时,实际只执行一条SQL语句。代码使用的是同一个SqlSession对象。(在缓存没有超时或是声明需要刷新时,就会在缓存获取数据)
二级缓存:
能在不同的SqlSession对象之间共享相同的缓存。在映射文件(XXXMapper.xml)加入代码:<cache/>()(Mybatis会将对应的命名夸奖呃逆所有的select元素SQL查询结果进行缓存。而其中的insert、delete和update语句在操作时会刷新缓存)
这样MyBatis会序列化和反序列化对应的POJO,也就要求POJO是一个可序列化对象。(如何没有,则会抛出异常,导致运行错误)
自定义cache:
1.cache元素的配置项
eviction 缓存策略分为:
LRU 最近最少使用:移除最长时间不被使用的对象 (默认)
FIFO 先进先出:按对象进入缓存的顺序来移除它们
SOFT 软引用:移除基于垃圾回收器状态和软引用规则对象
WEAK 弱引用:更积极移除基于垃圾回收器状态和弱引用规则对象
type:自定义缓存类(需要实现接口org.apache.ibatis.cache.Cahe)
2.现实中在这便可使用Redis\MongoDB进行常用缓存。
<cache type="xx.RedisCache">
<property name="host" value="localhost"/>
</cache>
可调用setHost(String host) 来设置配置内容
当不需要任何缓存时
<select ... flushCAHE="false" userCache="true"/>
flush代表是否刷新新缓存,而UserCache属性则只对select特有,代表是否需要使用缓存.
当其他的映射器需要数可使用同样的配置。引用缓存
<cache-ref namespace="xxxx.xxxxMapper"/>
网友评论