021.Mybatis的二级缓存---(2)
1.缓存清除策略中的参数详解
<!--开启了二级缓存 eviction是缓存的清除策略,当缓存对象数量达到上限后,自动触发对应算法对缓存对象清除 1.LRU – 最近最久未使用:移除最长时间不被使用的对象。 O1 O2 O3 O4 .. O512 14 99 83 1 893 2.FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 3.SOFT – 软引用:移除基于垃圾收集器状态和软引用规则的对象。 4.WEAK – 弱引用:更积极的移除基于垃圾收集器状态和弱引用规则的对象。 --> <cache eviction="LRU" flushInterval="600000" size="512" readOnly="true"/>
eviction:缓存的回收策略 LRU - 最近最少使用,移除最长时间不被使用的对象 FIFO - 先进先出,按对象进入缓存的顺序来移除它们 SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象 WEAK - 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象 默认的是LRU flushInterval:缓存刷新间隔 缓存多长时间清空一次,默认不清空,设置一个毫秒值 readOnly:是否只读 true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。 mybatis为了加快获取数据,直接就会将数据在缓存中的引用交给用户 。不安全,速度快 false:读写(默认):mybatis觉得获取的数据可能会被修改 mybatis会利用序列化&反序列化的技术克隆一份新的数据给你。安全,速度相对慢 size:缓存存放多少个元素 type:指定自定义缓存的全类名(实现Cache接口即可)
2.在SQL语句中的应用(goods.xml)
<!--useCache="false"代表不使用缓存--> <select id="selectAll" resultType="com.imooc.mybatis.entity.Goods" useCache="false"> select * from t_goods order by goods_id desc limit 10 </select>
<!-- flushCache="true"代表sql执行后立即清空缓存-->
<insert id="insert" parameterType="com.imooc.mybatis.entity.Goods" useGeneratedKeys="true" keyProperty="goodsId"
keyColumn="goods_id" flushCache="true">
<!--不用添加主键,主键是自动生成的编号 selectkey-->
INSERT INTO t_goods(title, sub_title, original_cost, current_price, discount, is_free_delivery, category_id)
VALUES (#{title} , #{subTitle} , #{originalCost}, #{currentPrice}, #{discount}, #{isFreeDelivery},
#{categoryId})
</insert>
3.MyBatis的flushCache和useCache的使用
(1)当为select语句时: flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。 useCache默认为true,表示会将本条语句的结果进行二级缓存。 (2)当为insert、update、delete语句时: flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。 useCache属性在该情况下没有。 当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,所以,如果有必要,那么就需要人工修改配置,修改结果类似下面: <select id="save" parameterType="XX" flushCache="true" useCache="false"> …… </select> update 的时候如果 flushCache="false",则当你更新后,查询的数据数据还是老的数据。