剖析两个经典的缓存策略:最近最少被使用(LRU)和软引用缓存
LRU,Mybatis巧妙的使用了LinkedHashMap.removeEldestEntry,此方法是一个受保护的方法,继承并重写这个方法,在方法中eldestKey持有被回收的对象,在做相关操作的使用轮训eldestKey,发现对象存在的时候,回收缓存容器中的对象。
public class LruCache implements Cache {
private final Cache delegate;
private Map<Object, Object> keyMap;
private Object eldestKey;
public LruCache(Cache delegate) {
this.delegate = delegate;
setSize(1024);
}
public String getId() {
return delegate.getId();
}
public int getSize() {
return delegate.getSize();
}
public void setSize(final int size) {
keyMap = new LinkedHashMap<Object, Object>(size, .75F, true) {
private static final long serialVersionUID = 4267176411845948333L;
protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) {
boolean tooBig = size() > size;
if (tooBig) {
eldestKey = eldest.getKey();
}
return tooBig;
}
};
}
public void putObject(Object key, Object value) {
delegate.putObject(key, value);
cycleKeyList(key);
}
public Object getObject(Object key) {
keyMap.get(key); //touch
return delegate.getObject(key);
}
public Object removeObject(Object key) {
return delegate.removeObject(key);
}
public void clear() {
delegate.clear();
keyMap.clear();
}
public ReadWriteLock getReadWriteLock() {
return delegate.getReadWriteLock();
}
private void cycleKeyList(Object key) {
keyMap.put(key, key);
if (eldestKey != null) {
delegate.removeObject(eldestKey);
eldestKey = null;
}
}
}
软引用缓存,个人认为比较高效的缓存,也是结合了Java垃圾回收的特点,也就是说如果对象不被引用,一旦开始垃圾回收,则该缓存对象会被回收。Mybatis使用了ReferenceQueue,会根据垃圾回收结果,在操作缓存是,回收缓存容器对象。
public class SoftCache implements Cache {
private final LinkedList hardLinksToAvoidGarbageCollection;
private final ReferenceQueue queueOfGarbageCollectedEntries;
private final Cache delegate;
private int numberOfHardLinks;
public SoftCache(Cache delegate) {
this.delegate = delegate;
this.numberOfHardLinks = 256;
this.hardLinksToAvoidGarbageCollection = new LinkedList();
this.queueOfGarbageCollectedEntries = new ReferenceQueue();
}
public String getId() {
return delegate.getId();
}
public int getSize() {
removeGarbageCollectedItems();
return delegate.getSize();
}
public void setSize(int size) {
this.numberOfHardLinks = size;
}
public void putObject(Object key, Object value) {
removeGarbageCollectedItems();
delegate.putObject(key, new SoftEntry(key, value, queueOfGarbageCollectedEntries));
}
public Object getObject(Object key) {
Object result = null;
SoftReference softReference = (SoftReference) delegate.getObject(key);
if (softReference != null) {
result = softReference.get();
if (result == null) {
delegate.removeObject(key);
} else {
hardLinksToAvoidGarbageCollection.addFirst(result);
if (hardLinksToAvoidGarbageCollection.size() > numberOfHardLinks) {
hardLinksToAvoidGarbageCollection.removeLast();
}
}
}
return result;
}
public Object removeObject(Object key) {
removeGarbageCollectedItems();
return delegate.removeObject(key);
}
public void clear() {
hardLinksToAvoidGarbageCollection.clear();
removeGarbageCollectedItems();
delegate.clear();
}
public ReadWriteLock getReadWriteLock() {
return delegate.getReadWriteLock();
}
private void removeGarbageCollectedItems() {
SoftEntry sv;
while ((sv = (SoftEntry) queueOfGarbageCollectedEntries.poll()) != null) {
delegate.removeObject(sv.key);
}
}
private static class SoftEntry extends SoftReference {
private final Object key;
private SoftEntry(Object key, Object value, ReferenceQueue garbageCollectionQueue) {
super(value, garbageCollectionQueue);
this.key = key;
}
}
}
分享到:
相关推荐
Mybatis缓存机制是数据库操作中的重要组成部分,它能够提高数据访问效率,减少对数据库的重复查询。在Mybatis中,缓存分为一级缓存和二级缓存,这两种缓存各有其特点和应用场景。 一级缓存是SqlSession级别的缓存,...
首先,理解MyBatis的缓存机制。MyBatis提供了两级缓存:一级缓存是SqlSession级别的,存在于SqlSessionFactory内部,而二级缓存是全局的,可以在多个SqlSession之间共享。默认情况下,一级缓存是开启的,但二级缓存...
#### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级缓存和二级缓存。 - **一级缓存**:...
此外,Mybatis的缓存机制也与其他技术如Spring Cache、 EhCache或Redis等集成,实现更高级别的缓存解决方案。例如,通过Spring Cache,开发者可以利用Spring的注解驱动来管理和控制缓存,实现更加灵活的缓存策略。 ...
MyBatis是一种流行的持久层框架,它提供了缓存机制来提高应用程序的性能。在MyBatis中,有两种类型的缓存:一级缓存和二级缓存。下面我们将深入了解MyBatis中的一级缓存和二级缓存。 一级缓存 一级缓存是...
在 MyBatis 中,缓存机制是提高性能的重要手段,它分为一级缓存和二级缓存。本篇将通过分析“mybatis读缓存源码demo”来探讨这两个缓存层次的工作原理和实现。 一级缓存是 SqlSession 级别的,它是默认开启的。每次...
Mybatis的缓存机制是其性能优化的重要组成部分,主要分为一级缓存和二级缓存。一级缓存是指SqlSession级别的缓存,而二级缓存则是全局的Mapper级别的缓存。 **一级缓存介绍及相关配置** 一级缓存是默认开启的,它...
将 Mybatis 与 Ehcache 结合使用,可以创建一个高效的缓存机制,降低数据库负载,提升应用程序响应速度。 在 Mybatis 中,缓存分为一级缓存和二级缓存。一级缓存是默认开启的,它基于 SqlSession 的生命周期,同一...
MyBatis作为一个优秀的持久层框架,提供了缓存机制来提升查询速度,减轻数据库负担。本文将深入探讨MyBatis层的缓存处理,以及如何在数据底层进行优化。 首先,我们要理解MyBatis的缓存分为一级缓存和二级缓存。一...
在 MyBatis 中,缓存机制是提升数据库操作效率的关键部分。MyBatis 提供了两种级别的缓存:一级缓存(Local Cache)和二级缓存(Global Cache)。在这篇文档《Mybatis缓存开源架构源码2021》中,很可能会深入探讨这...
标题中的“mybatis二级缓存”指的是MyBatis框架中的一个重要特性,它是MyBatis缓存机制的一部分,用于提升数据库查询效率。MyBatis一级缓存是SqlSession级别的,而二级缓存则是在整个Mapper配置范围内的全局缓存,...
在 MyBatis 中,缓存机制是提升数据库操作效率的重要工具。本文将深入讲解 MyBatis 的一级缓存和二级缓存,并通过一个简单的示例进行说明。 ### 一级缓存 一级缓存是 Session 级别的缓存,也称为本地缓存(Local ...
标题 "mybatis 缓存的简单配置" 涉及的是MyBatis框架中的缓存机制,这是一个关键特性,用于提升数据库操作的效率。MyBatis的缓存分为一级缓存和二级缓存,它们各自有不同的作用和实现方式。 一级缓存是SqlSession...
在实际开发中,为了提高应用程序的性能,MyBatis提供了缓存机制和动态SQL的功能。接下来,我们将深入探讨这两个重要知识点。 首先,我们来看MyBatis的缓存机制。MyBatis缓存分为一级缓存和二级缓存。一级缓存是...
在这个名为 "mybatis2020.zip" 的压缩包中,我们可以期待找到一系列关于 MyBatis 缓存机制的深入解析和实践案例。 MyBatis 的缓存机制是其性能优化的重要组成部分,分为一级缓存和二级缓存。一级缓存是基于 ...
在大型项目中,高效的缓存机制是必不可少的,以提高数据读取速度和减少数据库压力。"mybatis-enhanced-cache"正是针对MyBatis的一个缓存增强插件,它的出现是为了提供更细粒度的缓存控制,帮助开发者更好地管理和...
Mybatis-Plus 缓存机制详解 作为一名 IT 行业大师,我将对 Mybatis-Plus 缓存机制进行详细的解释,帮助读者深入了解缓存的概念、Mybatis-Plus 缓存机制的工作原理、一级缓存和二级缓存的配置和使用、缓存的优点和...
在MyBatis中,缓存机制是提升数据库操作效率的重要组成部分。本篇笔记将深入探讨MyBatis的缓存机制,包括一级缓存和二级缓存的概念、工作原理、配置与使用。 一级缓存是SqlSession级别的缓存,每当执行一个SQL查询...
MyBatis 提供了一级缓存和二级缓存两种缓存机制来优化数据的读取性能。 - **一级缓存**: 由 MyBatis 自身维护,也称为本地缓存,它的作用范围是同一个 `SqlSession` 内。在一个 `SqlSession` 中,执行查询操作时,...
根据缓存区的作用域(生命周期),MyBatis的查询缓存机制可以划分为两种:一级缓存和二级缓存。 一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession。在同一个...