MyBatis缓存机制深度解剖[收集].pdfVIP

  • 0
  • 0
  • 约2.08万字
  • 约 17页
  • 2021-10-19 发布于福建
  • 举报
缓存概述 正如大多数持久层框架一样, MyBatis 同样提供了一级缓存和二级缓存的 支持; 一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session ,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache , HashMap存储,不同在于其存储作用域为 Mapper(Namespace) ,并且可自 定义存储源,如 Ehcache 、Hazelcast 等。 对于缓存数据更新机制,当某一个作用域 ( 一级缓存 Session/ 二级缓存 Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的 缓存将被 clear 。 MyBatis 的缓存采用了 delegate 机制 及 装饰器模式设计, 当 put 、get 、 remove 时,其中会经过多层 delegate cache 处理,其 Cache类别有: BaseCache( 基础缓存 ) 、EvictionCache ( 排除算法缓存 ) 、 DecoratorCache ( 装饰器缓存 ) : BaseCache :为缓存数据最终存储的处理类,默认为 PerpetualCache , 基于 Map存储;可自定义存储处理,如基于 EhCache、Memcached等; EvictionCache :当缓存数量达到一定大小后, 将通过算法对缓存数据进 行清除。默认采用 Lru 算法 (LruCache) ,提供有 fifo 算法 (FifoCache) 等; DecoratorCache :缓存 put/get 处理前后的装饰器, 如使用 LoggingCache 输出缓存命中日志信息、使用 SerializedCache 对 Cache 的数据 put 或 get 进行序列化及反序列化处理、 当设置 flushInterval( 默认 1/h) 后, 则使用 ScheduledCache 对缓存数据进行定时刷新等。 一般缓存框架的数据结构基本上都是 Key-Value 方式存储, MyBatis 对 于其 Key 的生成采取规则为: [hashcode : checksum : mappedStementId : offset : limit : executeSql : queryParams] 。 对于并发 Read/Write 时缓存数据的同步问题, MyBatis 默认基于 JDK/concurrent 中的 ReadWriteLock ,使用 ReentrantReadWriteLock 的 实现,从而通过 Lock 机制防止在并发 Write Cache 过程中线程安全问 题。 源码剖解 接下来将结合 MyBatis 序列图进行源码分析。在分析其 Cache前,先看看其整 个处理过程。 执行过程 : ① 通常情况下, 我们需要在 Service 层调用 Mapper Interface 中的方法实现 对数据库的操作,上述根据产品

文档评论(0)

1亿VIP精品文档

相关文档