cache(二)——net.sf.ehcache.CacheManager

article/2025/10/4 4:14:16

 EhCacheManagerFactoryBean通过调用 CacheManager类的静态方法来获取实例,那么先看一下CacheManager类提供的static创建方法吧。

  1. 使用ehcache.jar中默认的缓存配置文件来创建EhcahceManager对象,调用无参的静态方法:
public static void main(String[] args){CacheManager mgr1 = CacheManager.getInstance();CacheManager mgr2 = CacheManager.create();CacheManager mgr3 = CacheManager.newInstance();System.out.println(mgr1 == mgr2);// trueSystem.out.println(mgr1 == mgr3);// true}

 这3种方式都是等价,获取的唯一实例也是相同的。通过源代码可以很容易的发现,这3个函数就是互相调用的关系。 

2. 使用自定义的ehcache.xml来获取单例对象

URL url = TestCacheManager.class.getClassLoader().getResource("conf/ehcache.xml");
CacheManager mgr1 = CacheManager.create(url);
CacheManager mgr2 = CacheManager.create("src/conf/ehcache.xml");
CacheManager mgr3 = CacheManager.newInstance("src/conf/ehcache.xml");System.out.println(mgr1 == mgr2);// true
System.out.println(mgr1 == mgr3);// true

 使用CacheManager的static方法,在指定了自定义的缓存配置文件的情况下,创建的仍然是唯一的单例对象。在小规模的应用中,我们可以在ehcache.xml中配置所有需要的<cache>。这样就能够使用一个CacheManager对象,来管理配置文件中的多个<cache>

3.同时使用有参的静态方法和无参的静态方法来获取实例呢?

CacheManager mgr1 = CacheManager.create("src/conf/ehcache.xml");CacheManager mgr4 = CacheManager.create();
CacheManager mgr5 = CacheManager.getInstance();
CacheManager mgr6 = CacheManager.newInstance();System.out.println(mgr1 == mgr4);// true
System.out.println(mgr1 == mgr5);// true
System.out.println(mgr1 == mgr6);// false

当使用ehcache.xml创建CacheManager对象的时候,CacheManager中的singleton属性会记录创建的对象值,即创建了CacheManager对象, singleton会记录该单例对象,不再是null ;

CacheManager.create()和CacheManager.getInstance()都会先判断 singleton属性是否为null,如果为null则继续调用newInstance(),如果不为null则直接返回。所以mgr1==mgr4==mgr5;

CacheManager.newInstance();不会判断 singleton是否为null,直接使用默认的ehcache-failsafe.xml,新建一个CacheManager对象,所以mgr1 != mgr 6. 

4. 调用关系如图:

CacheManager

从图中的调用关系可以看出,所有重载的newInstance()方法都是通过一个私有的重载方法

private static CacheManager newInstance(Configuration configuration, String msg)

来获取实例:这个方法会先根据配置名称configuration.getName()去CACHE_MANAGERS_MAP中查找是否已创建相同配置文件的实例,若已创建则直接返回该实例,若未创建,则调用CacheManager的构造器来new 一个新的实例

5. CacheManager 的构造方法:

CacheManager m1 = new CacheManager();
System.out.println(m1.getName());CacheManager m2 = new CacheManager("src/conf/ehcache.xml");
System.out.println(m2.getName());System.out.println(m1 == m2);// false// CacheManager m3 = new CacheManager();
// CacheManager m4 = new CacheManager("src/conf/ehcache.xml");

可以看出new出来的对象都是不同实例的,也就是说Ehcache框架支持多个CacheManager对象的情况。特别注意:

同一个缓存配置文件,只能new一个CacheManager对象。如果打开注释代码中的m3 和 m4会报错:

Another CacheManager with same name 'atyManager' already exists in the same VM .Please provide unique names for each CacheManager 

参考Ehcache CacheManager


http://chatgpt.dhexx.cn/article/CxV5RvdH.shtml

相关文章

@CacheEvict-缓存

CacheEvict 【清除缓存】 用于update\insert\delete方法上&#xff0c;清除Cacheable修饰的方法获取的缓存信息 【转载&#xff1a;https://xie.infoq.cn/article/001e0f5ab65fa7dd1484c51e5】 Cacheable 作用缓存&#xff0c;步骤&#xff1a; 注&#xff1a;这里使用 Cacheab…

YYCache源码分析

YYCache是OC用于缓存的第三方框架。 YYCache:同时实现内存缓存和磁盘缓存&#xff0c;且是线程安全的。YYDiskCache:实现磁盘缓存&#xff0c;所有的API是线程安卓的&#xff0c;内部也采用了LRU淘汰算法&#xff0c;主要是SQLite和文件存储两种方式。YYKVStorage:实现磁盘缓存…

Guava Cache、LoadingCache本地缓存的使用

前言&#xff1a;由于用户系统重构存在新老版本,网关对部分数据进行路径写死&#xff0c;所以为了避免频繁请求接口对网关日志记录进行本地缓存处理,学习过程中有Cache和LoadingCache两种模式&#xff0c;一番测试下都可以正常使用&#xff0c;特此记录 准备工作 添加依赖 &l…

YYCache,TMCache,SDImageDiskCache的比较以及二级缓存分析

YYCache传送门 点击打开链接 内存缓存 通常一个缓存是由内存缓存和磁盘缓存组成&#xff0c;内存缓存提供容量小但高速的存取功能&#xff0c;磁盘缓存提供大容量但低速的持久化存储。相对于磁盘缓存来说&#xff0c;内存缓存的设计要更简单些&#xff0c;下面是我调查的一些…

EVCache

EVCache介绍 EVCache是一个开源、快速的分布式缓存&#xff0c;是基于Memcached的内存存储和Spymemcached客户端实现的&#xff0c;是Netflix&#xff08;网飞&#xff09;公司开发的 E&#xff1a;Ephemeral&#xff1a;数据存储是短暂的&#xff0c;有自身的存活时间V&#…

cache 缓存

缓存原理 测试样例 验证码 获取验证码 验证 验证码是否正确 idea 启动缓存 手机验证码 idea 手机 获得验证码 ehchace 数据淘汰策略 使用redis 然后启动 redis 服务器 redis-server.exe redis.windows.conf 启动redis 客户端redis-cli.exe time-to-live 最大活动时间 缓…

YYCache源码解读 (一)

YYCache YYCache是 ibireme 大神在2015年设计的一个IOS缓存工具。   通常来讲&#xff0c;一个缓存包括内存缓存和磁盘缓存。YYCache在磁盘缓存的设计上使用数据库sqlite映射和文件系统映射的方式进行存储&#xff0c;内存中设计了一个双向链表的结构存储数据结点。内存和磁盘…

Guava Cache本地缓存

目录 本地缓存 回顾 Guava Cache介绍 Guava Cache使用 创建 删除 Guava Cache底层实现 本地缓存与分布式缓存对比 缓存三大问题 本地缓存 实现&#xff1a;CurrentHashMap、Guava Cache 缓存在应用服务器&#xff0c;全局变量&#xff0c;JVM缓存 回顾 JVM内存 方…

缓存(ehcache/guavaCache使用)

单机缓存 ehcache&#xff1a;单独使用&#xff1a;与spring集成&#xff1a;编程式操作&#xff1a;注解式使用&#xff1a; 与springboot集成&#xff1a; guava cache&#xff1a;单独使用&#xff1a;spring/springboot集成&#xff1a;自定义KeyGenerator&#xff1a; 自定…

iOS 缓存框架YYCache学习

文章目录 前言一、YYCache的来源二、YYCache的结构1. YYMemoryCache1.1 最近最少使用—LRU(Least Frequently Used)1.2 基于LRU的增删改查1.2.1 增加数据1.2.2 删除数据1.2.3 查找修改数据1.2.4 YYMemoryCache的增删改查 2.YYDiskCache 总结参考文章 前言 提示&#xff1a;这篇…

深入理解YYCache缓存策略

文章目录 前言几个主要成员类1 YYCache2 YYMemoryCache3 YYDiskCache 实例化1 实例方法2 构造器方法 查1 检查是否有缓存2 读缓存 增1 写内存缓存2 写磁盘缓存 删1 清空内存缓存2 清空磁盘缓存 YYMemoryCache 初始化做了什么总结本文完 前言 YYCache是著名iOS框架YYKit的一个组…

Unity OnDestroy 调用

Test Code private GameObject _temp;_temp Instantiate(Resources.Load("gameObject original"), parent) as GameObject;if (Input.GetMouseButtonDown(1)) {Destroy(_temp);_temp null; }试验结果&#xff08;场景中本来存在的gameObjec或Resources出来的game…

报错原因高的地图调用mapView.onDestroy() 崩溃问题

以前在android app中使用地图的项目需要使用高德地图。 按照高德地图的开发文档创建测试项目&#xff0c;导入依赖&#xff0c;很快就成功显示了地图&#xff0c;然后在退出地图Activity时&#xff0c;app立即崩溃&#xff0c;通过追踪&#xff0c;发现是在销毁地图时出现崩溃…

Android跨进程通信Client Crash后Server端onDestroy

hi&#xff0c;粉丝朋友大家好&#xff01; 好久没有给大家写blog了&#xff0c;哈哈&#xff0c;这里说声抱歉&#xff01;实在家里比较忙&#xff0c;今天就来给大家分享一个跨进程专题课中学员问的一个问题&#xff0c;blog就来解答一下这个问题。 问题背景&#xff1a; 视频…

Activity onDestroy延迟回调

前端时间工作的时候遇到了两个奇怪的问题&#xff1a; 使用百度步行导航的时候&#xff0c;开启导航后立即退出&#xff0c;再次进入的时候就会黑屏&#xff1b;使用度小满支付的时候&#xff0c;当支付成功后页面一直显示loading&#xff0c;过了10s左右才恢复正常。 这看似…

基于MFC的OpenDDS发布订阅例子(PubSubDemo)

在编译完成Message.idl,产生MessageCommon.dll和相应的MessageTypeSupport的.h头文件和.cpp文件(MessageTypeSupportImpl.h、MessageTypeSupportC.h)的基础上,新建PubSubDemo.sln和工程PubSubDemo.vcxproj,并开始编码,实现基于Message的发布和订阅流程。 1)新建基于Dia…

OPenDDS程序 的 实现+运行

标题DDS程序实现和运行 本文记录了Windows10环境下OpenDDS环境搭建&#xff0c;idl自定义&#xff0c;代码生成&#xff0c;代码编写的全过程。 一、环境搭建 1.详细情况请参考开发笔记&#xff1a;1. OpenDDS环境搭建-Windows 10.note 编译好后生成了两个文件夹“OpenDDS-3.…

OpenDDS-1

转自&#xff1a;软件开发.OpenDDS 设计智能座舱时ECU之间通信及与TSP通信选择使用OpenDDS是可以的&#xff0c;因此不少人都认为OpenDDS是属于汽车以太网&#xff08;Aumotive Ethernet&#xff0c;AE&#xff09;&#xff0c;但事实上autosar AE中定义中有SomeIP、DoIP、AVB…

Java程序调用OpenDDS

一、前言 前面我们用三篇博客介绍了 OpenDDS在WIndows上的环境配置 Windows下的OpenDDS编译&#xff08;超详细&#xff09;_山中野竹的博客-CSDN博客_opendds windows 三种方式运行发布订阅示例程序 OpenDDS运行示例&#xff08;Messenger&#xff09;程序_山中野竹的博客-C…

OpenDDS运行实例

因为OpenDDS是分布式的部署&#xff0c;所以一般发布端和订阅端都不在同一台电脑上。 我在同一台电脑上进行测试&#xff0c;所以ip地址为&#xff1a;127.0.0.1 1.发布端 1.1 新建ior文件 在根目录先新建repo.ior文件&#xff1a; IOR:010000001e00000049444c3a4f70656e44…