Mybatis源码学习(三)cache包

采用装饰模式,一个个包装起来,形成一个链,通过链起来达到功能增加。

  • Cache接口:
    Mybatis源码学习(三)cache包_第1张图片
    Key通常是CacheKey,value是对应的查询结果。

  • CacheException类:缓存异常,继承关系如下:
    CacheException->PersistenceException(持久化异常)->IbatisException(该接口已经废弃)-> RuntimeException->Exception->Throwable

  • CacheKey类: 缓存Key

项目名 描述
属性 静态常量:NULL_CACHE_KEY,DEFAULT_MULTIPLYER(37),DEFAULT_HASHCODE(17)
变量: hashcode(哈希码),checksum(校验总和码),count(参与计算的总数),updateList(参与计算的对象列表)
核心方法 update更新变量,equals(先比较哈希码、校验码、count,如果都相同则严格比较list),hashCode方法覆盖
  • NullCacheKey类: 缓存Null值key,update会抛出异常

  • TransactionalCacheManager类,事务缓存管理器,被cachingExecutor使用。包含一个的Map,管理多个事务缓存,提交时全部提交,回滚时改管理器内的事务全部回滚。

  • PerpetualCache类:永久缓存,是Cache接口的一个实现,内部就是一个HashMap,所有方法基本就是直接调用HashMap的方法

  • BlockingCache类:查询时在key上加锁,缓存中找到key的对应值就释放该锁,否则直到填充了该对应的value才释放这个锁。这样没有结果时,其他的线程将会等待而不会去查询数据库。

  • FifoCache类:维护一个FIFO链表,其他都委托给所包装的cache去做。增加记录时判断如果记录已超过1024条,会移除链表的第一个元素,从而达到FIFO缓存效果

  • LoggingCache类:属性hits、requests,getObject时,打印命中率,访问一次requests加一,命中了则hits加一,打印命中率hits/requests。

  • LruCache类:额外用了一个map做lru,但是委托的Cache里面其实也是一个map,这样等于用2倍的内存实现lru功能。默认大小1024,初始化大小时将LinkedHashMap初始化,并覆盖LinkedHashMap. removeEldestEntry方法。增加新纪录后,判断是否要将最老元素移除,移除时linkedHashMap在插入时自动判断与移除,需要额外将委托的Cache里的对应对象移除。

  • ScheduledCache类:每一小时清空一下缓存。属性clearInterval(清除的时间间隔)、lastClear(最后一次清除时间)。进行各项和map相关的操作前,都先判断一下有没有到时间,时间到了就清空一次缓存,clear方法中设置lastClear

  • SerializedCache类:序列化缓存,先将对象序列化成2进制,再缓存。将对象压缩了省内存,但是速度慢了。Put前先序列化,get前反序列化。

  • SoftCache类:软引用缓存,核心是SoftReference,有两个链表:一个链表用来引用元素,防止垃圾回收;另一个被垃圾回收的引用队列。链表大小默认256。

    核心方法:查看被垃圾回收的引用队列,然后调用委托者removeObject移除对应的软引用。PutObject中存一个软引用,getObject通过委托者获取到软引用,通过软引用获取到value,如果为null,则从委托者中移除,否则将其加入到防止垃圾回收的链表(头部添加,尾部删除)。

  • SynchronizedCache类:同步缓存,防止多线程问题,核心: 加锁。3.2.6以后这个类已经没有使用了,考虑到Hazelcast, EhCache已经有锁机制了。

  • TransactionalCache类:事务缓存,一次性存入多个缓存,移除多个缓存。clearOnCommit,默认默认commit时不清缓存,Map型entriesToAddOnCommit:提交时要添加的值,entriesMissedInCache缓存中丢失了的值。多了commit和rollback方法。Put方法仅仅将值加入map中,不提交给委托者。

  • WeakCache:弱引用缓存,核心是WeakReference。代码和SoftCache类似。

你可能感兴趣的:(源码学习)