[MyBatis]二级缓存

二级缓存:

  • Session去执行该Mapper下的查询方法时(第一次查询),会将该查询结果存放在Mapper的二级缓存区域
  • Session去执行该Mapper下的查询方法时(第二次查询),会判断该Mapper下有没有缓存,如果有,则不向数据库查询,直接取缓存
  • Session去执行该Mapper下的commit()方法后,则清空该Mapper下的二级缓存

二级缓存与一级缓存的区别:
多个Session可以共享Mapper下的数据,二级缓存是按照Mapper的namespace划分,每一个Mapper都有自己的二级缓存区域,如果两个Mapper的namespace相同,那么这两个Mapper共用一个二级缓存区域

开启二级缓存:

  • 先向总配置文件开启二级缓存,SqlMapConfig.xml中
<configuration>
    <!-- 
        //....
    -->

    <!-- 全局配置参数,需要时再设置 -->
    <settings>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

</configuration>
  • 在Mapper.xml中
<mapper namespace="mapper.OrdersMapper" >
    <!-- 
        //....
    -->

    <!-- 开启本mapper下的namespace二级缓存 -->
    <cache />
</mapper>
  • 在POJO类中实现序列化接口
public class Orders implements Serializable {
    /**
     * 为什么要实现Serializable接口呢?
     * 实际上mybaties在存储二级缓存数据时,不止是将数据存放在内存中,
     * 还会将数据存放在硬盘中,还可能会放在其他地方,有很多种可能性,
     * 所以要取硬盘中的数据时,因为实现了Serializable接口,
     * 就可以反序列化取了.
     */
}

禁用二级缓存
在Mapper.xml中,可以将个别select查询设置为禁用二级缓存

    <!-- 
        useCache:是否禁用二级缓存
                1>默认为true(开启二级缓存)
                2:false:禁用二级缓存
    -->
    <!-- 根据用户id查询订单 -->
    <select id="findOrdersByUserId" parameterType="int" resultMap="order_user" 
            useCache="false" >
        SELECT
            o.*,
            u.username,u.sex,u.address
        FROM
            orders AS o , user AS u
        WHERE
            o.user_id = #{value} AND u.id = o.user_id
    </select>

刷新缓存(清空缓存)
在Mapper.xml中,可以将个别添加,删除,更新的statement设置刷新缓存属性,一般执行完commit()之后都会执行刷新缓存,所以一般不用设置此属性,使用默认值即可.

<!-- 
        flushCache:刷新缓存(就是清空缓存里的所有数据)
                  1>flushCache="true":开启刷新缓存
                  2>flushCache="false":关闭刷新缓存
        一般执行完commit()之后都会执行刷新缓存,
        刷新缓存也就是flushCache="true",
        可以避免脏读.
    -->
    <delete id="deleteUser" parameterType="int" flushCache="true">
        delete from user where id = #{id}
    </delete>
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值