美文网首页
Mybatis 随笔

Mybatis 随笔

作者: 那谁319 | 来源:发表于2019-07-28 21:41 被阅读0次

    SqlSessionFactoryBean

    • 创建SqlSessionFactory对象
    • 创建SqlSessionFactory对象时会创建Configuration对象
    • 创建Configuration对象
      • 构建各种属性对象 如
    • mybatis的缓存key对象CacheKey,实现类重写了hashcode方法和equals方法,
      一级缓存放到本地map中,键值对的key为CacheKey对象,map键是否相等的比较方法是是否是同一个对象,或者equals方法返回true
    • Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");

      • 所有的sql语句集合
    • 执行器Executor默认使用的CachingExecutor,其中CachingExecutor持有SimpleExecutor实现类

    • 数据查询的执行顺序

      • 当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
    • 一级缓存使用的问题

      • MyBatis一级缓存的生命周期和SqlSession一致。
      • MyBatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺。
      • MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。
    • 二级缓存使用的问题

      • MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。
      • MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件比较苛刻。
      • 在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本,直接使用Redis、Memcached等分布式缓存可能成本更低,安全性也更高。

    相关文章

      网友评论

          本文标题:Mybatis 随笔

          本文链接:https://www.haomeiwen.com/subject/oxcdlctx.html