轻量级前端框架助力开发者提升项目效率与性能
898
2022-10-19
Mybatis的这两个缓存装饰器不要忽略
Mybatis的这两个缓存装饰器不要忽略
这篇文章继续介绍聊聊Mybatis的缓存的其他装饰者
引用的缓存装饰器
SoftCache是软引用的缓存装饰器,软引用就是在JVM内存不足的时候,软引用的对象会被垃圾回收器回收,软引用对象SoftReference可以关联ReferenceQueue引用队列,当对象被回收的时候,会通知引用队列对象被回收了。
内部成员
SoftCache类中定义了一个内部类SoftEntry:
private static class SoftEntry extends SoftReference
它继承了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
软引用中记录了这个key,对应value软引用中没有了就调用被装饰器删除对应的缓存 把用到的value值放入LinkedList头部中,这样value就是强引用了,不会被垃圾回收器回收,默认放入256个,超出就删除尾部的 返回value值
弱引用缓存装饰器
WeakCache是弱引用缓存装饰器,它的代码大部分和SoftCache一样
内部成员
唯一不同的就是内部类的定义不同,这个是继承的WeakReference弱引用类
private static class WeakEntry extends WeakReference
它也是对应key为强引用,value为弱引用。
总结
这篇文章主要介绍了Mybatis的缓存的其他装饰者SoftCache的WeakCache,SoftCache是软引用缓存装饰器,通过应用引用队列记录被垃圾回收器回收的key,在putObject()方法调用的时候会清理掉被垃圾回收器回收key对应的缓存信息,在getObject()方法中通过LinkedList保存256个key对应的value值,防止被回收。WeakCache是弱引用缓存装饰器,它的原理和SoftCache差不多,只是SoftCache是在内存不够的时候才会回收缓存,而WeakCache被垃圾回收器扫描到就会回收
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~