• 框架——持久层框架——mybatis——缓存


      mybatis有两种缓存,一级缓存,二级缓存。

    1、一级

      一级缓存存在于sqlSession对象的生命周期中,伴随着对象的产生,自动生效,伴随着对象的关闭,自动清除。

    同一个sqlSession的XXMapper接口,它执行更新,删除,插入都会刷新缓存。

    一级缓存只适用于查询语句,若需关闭,在select配置flushCache为true即可。

    2、二级

     二级缓存的定义,操作(开启,配置,关闭),FAQ。

    二级缓存存在于sqlSessionFactory对象的生命周期中,以Mapper的NameSpace缓存其查询结果,Statement语句等等。

    2.1  操作

    开启:在配置文件中设置cacheEnabled为true,并在XXMapper.xml中添加cache标签,配置它的属性。

    配置:示例:<cache eviction="LRU" size="3" flushInterval="60*1000" readOnly="true"/>

    1. eviction:回收策略算法,支持LRU, FIFO, SOFT, WEAK。SOFT, WEAK是指Java的软引用和弱引用回收。
    2. flushInterval:缓存的刷新间隔,单位为毫秒。任何修改操作都会刷新缓存。
    3. size:缓存的引用个数,默认为1024。
    4. readonly:缓存是否持久化,若为true,则在内存中,以Map对象存在。若为false, 需要实现序列化接口。

    关闭:默认未开启,设置cacheEnable为false即可。

    2.2   FAQ

    脏数据

      当查询结果集为多个表的数据时,结果集需要映射为多个实体类型,例如用户对象中存在多个角色,需要返回List<Role>时。此时User对应UserMapper的命名空间,Role对应RoleMapper的命名空间,如果select语句存在与UserMapper命名空间下时,对RoleMapper命名空间下的增,删,改会导致UserMapper查询得到的Role不是最新的,此时User对应的List<Role>为脏数据。

      处理这种情况需要在UserMapper中配置<cache-ref namespace=”roleMapper的命名空间”>,当进行Role的修改时,也会同步刷新UserMapper的缓存。

  • 相关阅读:
    比较对象的相对性
    深拷贝与浅拷贝(TBD)
    创建UI的线程才能访问UI,那么怎样才算访问UI呢
    多层级的数据绑定效果
    众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?
    常量、只读字段
    使用dos打开相关软件
    查看电脑硬件信息dos命令
    Windows常用快捷键
    使用外部编辑器出现乱码
  • 原文地址:https://www.cnblogs.com/rain144576/p/16659513.html
Copyright © 2020-2023  润新知