Bootstrap

MyBatis最佳实践:MyBatis 框架的缓存

  1. 缓存的概念:

    1. 在内存中临时存储数据,速度快,可以减少数据库的访问次数
    2. 经常需要查询,不经常修改的数据,不是特别重要的数据都适合存储到缓存中
  2. 缓存的级别:

    1. 一级缓存(默认开启):SqlSession 级别
      1. 一级缓存存储的是对象
    2. 二级缓存(默认关闭):nameSpace 级别
      1. 二级缓存存储的是实际数据
  3. 优先访问级:

    1. 先访问二级缓存,再访问一级缓存,其次是数据库
  4. MyBatis 的一级缓存(本地缓存):

    1. 一级缓存存放在 SqlSession 对象中
    2. SqlSession 对象来访问数据库
    3. 在 SqlSessin 对象中有:
      1. cache:缓存(底层是 HashMap)
      2. Executor:执行器
    4. 作用:
      1. 与数据库同一次会话期间查询到的数据会放入到本地缓存中去
      2. 如果以后获取相同的数据直接去缓存中拿取,没必要再去查询数据库
    5. 示例:
      1. 执行两次方法只进行了一次查询,且为一个对象
  5. 一级缓存失效:

    1. 原因:
      1. SqlSession不同:
      2. SqlSession相同,查询条件不同:
      3. SqlSession相同,两次查询之间进行了增删改查操作:
      4. 手动清除一级缓存:
        1. session.clearCache():
  6. 二级缓存:

    1. 设置配置:
    2. 在 xml 中开启二级缓存:
    3. 使用二级缓存:实现序列化接口
      1. 目的:把类转换成数据
    4. 关闭一级缓存:
      //查询信息
      List<User> users1 = mapper.findById(6);
      session.close();    //关闭一级缓存
      List<User> users2 = mapper2.findById(6);
      session.close();    //关闭一级缓存
  7. Catch 参数的细节:

    1. eviction(回收策略):
      1. LRU(最近最少使用):移除最长时间不被使用的对象,默认值
      2. FIFO(先进先出):按对进入缓存的顺序来移除
      3. SOFT(软引用):移除基于垃圾收集处理器状态和弱引用规则的对象
      4. WEAK(弱引用):更积极地移除基于垃圾收集器状态和弱引用规则的对象
    2. flushinterval(刷新间隔):
      1. 可以被设置为任意的正整数,而且他们代表一个合理的毫秒形式的时间段
      2. 默认情况不设置,即没有刷新间隔,缓存仅仅在调用语句时刷新
    3. size(引用数目):
      1. 可以被设置为任意正整数,要记住缓存的对象数目和运行环境可用内存支援数目。默认值时 1024
    4. readOnly(只读):
      1. true(只读缓存):会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改,这提供了很重要的性能优势
      2. false(读写缓存):通过序列化返回缓存对象的拷贝,这种方式会慢一些,但是安全,因此默认是  false
    5. 配置结果:
      <cache eviction="FIFO"
      flushInterval="6000"
      size="512"
      readOnly="true"/>
  8. MyBatis 缓存查询顺序:

    1. 先查询二级缓存,因为二级缓存中可能有其他程序查询出来的数据,可以直接拿来用
    2. 如果二级缓存没有命中,再查询一级缓存
    3. 如果一级缓存也没有命中,则查询数据库
    4. SqlSession 关闭之后,一级缓存的数据会写入二级缓存
;