`

Mybatis Cache缓存机制

阅读更多

剖析两个经典的缓存策略:最近最少被使用(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缓存机制是数据库操作中的重要组成部分,它能够提高数据访问效率,减少对数据库的重复查询。在Mybatis中,缓存分为一级缓存和二级缓存,这两种缓存各有其特点和应用场景。 一级缓存是SqlSession级别的缓存,...

    基于mybatis自定义缓存配置Redis

    首先,理解MyBatis的缓存机制。MyBatis提供了两级缓存:一级缓存是SqlSession级别的,存在于SqlSessionFactory内部,而二级缓存是全局的,可以在多个SqlSession之间共享。默认情况下,一级缓存是开启的,但二级缓存...

    mybatis+redis缓存配置

    #### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级缓存和二级缓存。 - **一级缓存**:...

    Mybatis系列教程Mybatis缓存共17页.pdf

    此外,Mybatis的缓存机制也与其他技术如Spring Cache、 EhCache或Redis等集成,实现更高级别的缓存解决方案。例如,通过Spring Cache,开发者可以利用Spring的注解驱动来管理和控制缓存,实现更加灵活的缓存策略。 ...

    深入理解MyBatis中的一级缓存与二级缓存

    MyBatis是一种流行的持久层框架,它提供了缓存机制来提高应用程序的性能。在MyBatis中,有两种类型的缓存:一级缓存和二级缓存。下面我们将深入了解MyBatis中的一级缓存和二级缓存。 一级缓存 一级缓存是...

    mybatis读缓存源码demo

    在 MyBatis 中,缓存机制是提高性能的重要手段,它分为一级缓存和二级缓存。本篇将通过分析“mybatis读缓存源码demo”来探讨这两个缓存层次的工作原理和实现。 一级缓存是 SqlSession 级别的,它是默认开启的。每次...

    Mybatis的缓存1

    Mybatis的缓存机制是其性能优化的重要组成部分,主要分为一级缓存和二级缓存。一级缓存是指SqlSession级别的缓存,而二级缓存则是全局的Mapper级别的缓存。 **一级缓存介绍及相关配置** 一级缓存是默认开启的,它...

    Mybatiscache

    将 Mybatis 与 Ehcache 结合使用,可以创建一个高效的缓存机制,降低数据库负载,提升应用程序响应速度。 在 Mybatis 中,缓存分为一级缓存和二级缓存。一级缓存是默认开启的,它基于 SqlSession 的生命周期,同一...

    缓存处理-mybatis层

    MyBatis作为一个优秀的持久层框架,提供了缓存机制来提升查询速度,减轻数据库负担。本文将深入探讨MyBatis层的缓存处理,以及如何在数据底层进行优化。 首先,我们要理解MyBatis的缓存分为一级缓存和二级缓存。一...

    Mybatis缓存开源架构源码2021.pdf

    在 MyBatis 中,缓存机制是提升数据库操作效率的关键部分。MyBatis 提供了两种级别的缓存:一级缓存(Local Cache)和二级缓存(Global Cache)。在这篇文档《Mybatis缓存开源架构源码2021》中,很可能会深入探讨这...

    mybatis二级缓存

    标题中的“mybatis二级缓存”指的是MyBatis框架中的一个重要特性,它是MyBatis缓存机制的一部分,用于提升数据库查询效率。MyBatis一级缓存是SqlSession级别的,而二级缓存则是在整个Mapper配置范围内的全局缓存,...

    mybatis一级缓存和二级缓存简单示例

    在 MyBatis 中,缓存机制是提升数据库操作效率的重要工具。本文将深入讲解 MyBatis 的一级缓存和二级缓存,并通过一个简单的示例进行说明。 ### 一级缓存 一级缓存是 Session 级别的缓存,也称为本地缓存(Local ...

    mybatis 缓存的简单配置

    标题 "mybatis 缓存的简单配置" 涉及的是MyBatis框架中的缓存机制,这是一个关键特性,用于提升数据库操作的效率。MyBatis的缓存分为一级缓存和二级缓存,它们各自有不同的作用和实现方式。 一级缓存是SqlSession...

    myBatis_Cache_Dynamic.rar

    在实际开发中,为了提高应用程序的性能,MyBatis提供了缓存机制和动态SQL的功能。接下来,我们将深入探讨这两个重要知识点。 首先,我们来看MyBatis的缓存机制。MyBatis缓存分为一级缓存和二级缓存。一级缓存是...

    mybatis2020.zip

    在这个名为 "mybatis2020.zip" 的压缩包中,我们可以期待找到一系列关于 MyBatis 缓存机制的深入解析和实践案例。 MyBatis 的缓存机制是其性能优化的重要组成部分,分为一级缓存和二级缓存。一级缓存是基于 ...

    mybatis-enhanced-cache源码和jar包

    在大型项目中,高效的缓存机制是必不可少的,以提高数据读取速度和减少数据库压力。"mybatis-enhanced-cache"正是针对MyBatis的一个缓存增强插件,它的出现是为了提供更细粒度的缓存控制,帮助开发者更好地管理和...

    mybatis-plus 缓存(二)

    Mybatis-Plus 缓存机制详解 作为一名 IT 行业大师,我将对 Mybatis-Plus 缓存机制进行详细的解释,帮助读者深入了解缓存的概念、Mybatis-Plus 缓存机制的工作原理、一级缓存和二级缓存的配置和使用、缓存的优点和...

    【MyBatis学习笔记八】——MyBatis缓存.zip

    在MyBatis中,缓存机制是提升数据库操作效率的重要组成部分。本篇笔记将深入探讨MyBatis的缓存机制,包括一级缓存和二级缓存的概念、工作原理、配置与使用。 一级缓存是SqlSession级别的缓存,每当执行一个SQL查询...

    mybatis的讲课笔记, 包含mybatis的缓存,配置等

    MyBatis 提供了一级缓存和二级缓存两种缓存机制来优化数据的读取性能。 - **一级缓存**: 由 MyBatis 自身维护,也称为本地缓存,它的作用范围是同一个 `SqlSession` 内。在一个 `SqlSession` 中,执行查询操作时,...

    MyBatis查询缓存实例详解

    根据缓存区的作用域(生命周期),MyBatis的查询缓存机制可以划分为两种:一级缓存和二级缓存。 一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession。在同一个...

Global site tag (gtag.js) - Google Analytics