• mybatis由浅入深day02_7.3二级缓存


      7.3 二级缓存

        7.3.1 原理

    下图是多个sqlSession请求UserMapper的二级缓存图解。

    首先开启mybatis的二级缓存。

    sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中。

    如果SqlSession3去执行相同 mapper下sql,执行commit提交,清空该 mapper下的二级缓存区域的数据。

    sqlSession2去查询用户id为1的用户信息,去缓存中找是否存在数据,如果存在直接从缓存中取出数据。

    二级缓存区域是根据mapper的namespace划分的,相同namespace的mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分。

    每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。

    Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

    sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。

    二级缓存与一级缓存区别,二级缓存的范围更大,多个sqlSession可以共享一个UserMapper的二级缓存区域。

    UserMapper有一个二级缓存区域(按namespace分) ,其它mapper也有自己的二级缓存区域(按namespace分)。

    每一个namespace的mapper都有一个二缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同 的二级缓存区域中。

        7.3.2 开启二级缓存

    mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。

    在核心配置文件SqlMapConfig.xml中加入

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

    描述

    允许值

    默认值

    cacheEnabled

    对在此配置文件下的所有cache 进行全局性开/关设置。

    true false

    true

    在UserMapper.xml中开启二缓存,UserMapper.xml下的sql执行完成会存储到它的缓存区域(HashMap)。

      

        7.3.3 调用pojo类实现序列化接口

    二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作,注意如果存在父类、成员pojo都需要实现序列化接口。

      public class Orders implements Serializable

      public class User implements Serializable

      ....

      

    为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一在内存。

        7.3.4 测试方法

      

      

        7.3.5 useCache配置禁用二级缓存

    在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

    <select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

    总结:针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存。

        7.3.6 刷新缓存(就是清空缓存)

    在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。

     设置statement配置中的flushCache="true" 属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。

    如下:

    <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">

    总结:一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。

        7.3.7 Mybatis Cache参数

    flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

    size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。

    readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

     

    如下例子:

    <cache  eviction="FIFO"  flushInterval="60000"  size="512"  readOnly="true"/>

    这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有, 默认的是 LRU:

    1. LRU – 最近最少使用的:移除最长时间不被使用的对象。

    2. FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

    3. SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

    4. WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

  • 相关阅读:
    MVC5 Entity Framework学习之Entity Framework高级功能(转)
    js获取当前日期的前一天、一月、一年的日期 明天、后天(转)
    easyui datagrid 分页
    博客园技术精粹集合留贴
    常用C# DateTime 日期计算
    Jquery设置Cookie
    设计模式 -- 装饰者模式
    设计模式 -- 策略模式
    IBatis.Net中调用存储过程
    其他元素条件 IBatisNet
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8051701.html
Copyright © 2020-2023  润新知