美文网首页读书
Mybatis的这两个缓存装饰器不要忽略

Mybatis的这两个缓存装饰器不要忽略

作者: Java编程日记 | 来源:发表于2022-08-15 13:53 被阅读0次

Mybatis的这两个缓存装饰器不要忽略
这篇文章继续介绍聊聊Mybatis的缓存的其他装饰者

引用的缓存装饰器
SoftCache是软引用的缓存装饰器,软引用就是在JVM内存不足的时候,软引用的对象会被垃圾回收器回收,软引用对象SoftReference可以关联ReferenceQueue引用队列,当对象被回收的时候,会通知引用队列对象被回收了。

内部成员
SoftCache类中定义了一个内部类SoftEntry:

private static class SoftEntry extends SoftReference<Object> {
    private final Object key;

    SoftEntry(Object key, Object value, ReferenceQueue<Object> garbageCollectionQueue) {
      super(value, garbageCollectionQueue);
      this.key = key;
    }
  }

它继承了SoftReference,设置key为强引用,value为软引用,并设置引用队列garbageCollectionQueue

放置元素
看一下SoftCache类的putObject()方法:

@Override
  public void putObject(Object key, Object value) {
    removeGarbageCollectedItems();
    delegate.putObject(key, new SoftEntry(key, value, queueOfGarbageCollectedEntries));
  }
  private void removeGarbageCollectedItems() {
    SoftEntry sv;
    while ((sv = (SoftEntry) queueOfGarbageCollectedEntries.poll()) != null) {
      delegate.removeObject(sv.key);
    }
  }

调用removeGarbageCollectedItems()方法,这个方法是遍历queueOfGarbageCollectedEntries记录的被垃圾回收器回收value对象对应的key,然后从被装饰器中删除缓存
调用被装饰器放入缓存
获取元素
从SoftCache类的getObject()方法可以看出:

@Override
  public Object getObject(Object key) {
    Object result = null;
    @SuppressWarnings("unchecked") // assumed delegate cache is totally managed by this cache
    SoftReference<Object> softReference = (SoftReference<Object>) delegate.getObject(key);
    if (softReference != null) {
      result = softReference.get();
      if (result == null) {
        delegate.removeObject(key);
      } else {
        // See #586 (and #335) modifications need more than a read lock
        synchronized (hardLinksToAvoidGarbageCollection) {
          hardLinksToAvoidGarbageCollection.addFirst(result);
          if (hardLinksToAvoidGarbageCollection.size() > numberOfHardLinks) {
            hardLinksToAvoidGarbageCollection.removeLast();
          }
        }
      }
    }
    return result;
  }

软引用中记录了这个key,对应value软引用中没有了就调用被装饰器删除对应的缓存
把用到的value值放入LinkedList头部中,这样value就是强引用了,不会被垃圾回收器回收,默认放入256个,超出就删除尾部的
返回value值
弱引用缓存装饰器
WeakCache是弱引用缓存装饰器,它的代码大部分和SoftCache一样

内部成员
唯一不同的就是内部类的定义不同,这个是继承的WeakReference弱引用类

private static class WeakEntry extends WeakReference<Object> {
    private final Object key;

    private WeakEntry(Object key, Object value, ReferenceQueue<Object> garbageCollectionQueue) {
      super(value, garbageCollectionQueue);
      this.key = key;
    }
  }

它也是对应key为强引用,value为弱引用。

总结
这篇文章主要介绍了Mybatis的缓存的其他装饰者SoftCache的WeakCache,SoftCache是软引用缓存装饰器,通过应用引用队列记录被垃圾回收器回收的key,在putObject()方法调用的时候会清理掉被垃圾回收器回收key对应的缓存信息,在getObject()方法中通过LinkedList保存256个key对应的value值,防止被回收。WeakCache是弱引用缓存装饰器,它的原理和SoftCache差不多,只是SoftCache是在内存不够的时候才会回收缓存,而WeakCache被垃圾回收器扫描到就会回收

相关文章

  • Mybatis的这两个缓存装饰器不要忽略

    Mybatis的这两个缓存装饰器不要忽略这篇文章继续介绍聊聊Mybatis的缓存的其他装饰者 引用的缓存装饰器So...

  • 聊聊缓存

    本地缓存:mybatis实现:装饰器模式实践 PerpetualCache:永久缓存:通过HashMap实现最大容...

  • mybatis 二级缓存源码阅读

    mybatis 二级缓存源码阅读 二级缓存 二级缓存之所以能够跨session是因为采用的装饰器模式对Execut...

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • mybatis缓存源码解析

    mybatis源码阅读 二级缓存 二级缓存之所以能够跨session是因为采用的装饰器模式对Executor进行了...

  • 第07篇:Mybatis缓存装饰器

    MyBatis 对缓存的设计是非常巧妙的。花样很多,但却不是真的花样。因为Mybatis只是对 Map数据结构的封...

  • mybatis:在springboot中的配置

    Mybatis 配置 使全局的映射器启用或禁用缓存。mybatis.configuration.cache-ena...

  • Python 高级编程系列(二)

    Python 装饰器常见用法 装饰器与spring 中的AOP类似 通过装饰器可以实现面向切面的注入 一:缓存 ...

  • MyBatis自定义缓存

    系统缓存是MyBatis应用机器上的本地缓存,但是在大型服务器上,会使用各类不同的缓存服务器,这个时候我们可以定制...

  • 装饰器

    函数装饰器:通常用于插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计 类装饰器:...

网友评论

    本文标题:Mybatis的这两个缓存装饰器不要忽略

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