Ehcache简介
目录
1 CacheManager
1.1 构造方法构建
1.2 静态方法构建
2 Cache
2.1 Cache的创建
Ehcache是用来管理缓存的一个工具,其缓存的数据可以是存放在内存里面的,也可以是存放在硬盘上的。其核心是CacheManager,一切Ehcache的应用都是从CacheManager开始的。它是用来管理Cache(缓存)的,一个应用可以有多个CacheManager,而一个CacheManager下又可以有多个Cache。Cache内部保存的是一个个的Element,而一个Element中保存的是一个key和value的配对,相当于Map里面的一个Entry。
1 CacheManager
CacheManager是Ehcache的核心,它的主要职责是对Cache的创建、移除和访问。只有CacheManager里面的Cache才能实现缓存数据的功能。一切使用Ehcache的应用都是从构建CacheManager开始的。构建CacheManager时,我们可以直接通过其构造方法来进行构建,也可以通过使用CacheManager提供的静态方法来进行构建。
1.1 构造方法构建
使用构造方法构建CacheManager时每次都会产生一个新的CacheManager对象,并且会以该CacheManager对应的name作为key保存该CacheManager。当我们在构建CacheManager时如果已经存在name相同正在使用的CacheManager,则会抛出异常。此外,当多个CacheManager对应的storePath相同时,则它们存放在磁盘上包含缓存信息的文件将会相互覆盖。
1.使用默认配置
当我们使用CacheManager的无参构造方法来构造CacheManager时就是使用的默认配置。这种情况最终还是会寻找默认的配置文件进行配置。Ehcache首先会到类根路径下寻找一个叫ehcache.xml的配置文件来配置CacheManager,如果没有找到该文件,则会加载CacheManager的默认配置ehcache-failsafe.xml文件,这个文件是在ehcache.jar里面的。关于配置文件如何配置的问题将在后续的文章中再做一个详细的讲解,这里先来简单看一个配置文件。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <cache name="test" maxBytesLocalHeap="10M"/> </ehcache>
每一个配置文件的根元素都是ehcache,在该元素上可以指定一些CacheManager级别的参数。ehcache元素下的每一个cache元素代表一个缓存定义。cache元素上可以指定一些Cache级别的属性。下面是一个使用默认配置构建CacheManager的示例。
@Test public void testDefault() { CacheManager cacheManager = new CacheManager(); //输出当前cacheManager正在使用的配置对应的Xml格式文本 System.out.println(cacheManager.getActiveConfigurationText()); }
2.以Configuration作为参数
Configuration是用来指定CacheManager配置信息的,其它通过不同的方式所指定的构造参数最终都会转化为一个对应的Configuration对象,然后再利用该Configuration对象初始化CacheManager。
@Test public void test() { //新建一个CacheManager的配置信息 Configuration configuration = new Configuration(); //新建一个缓存的配置信息 CacheConfiguration cacheConfiguration = new CacheConfiguration().name("test"); //指定当前缓存的最大堆内存值为100M cacheConfiguration.maxBytesLocalHeap(100, MemoryUnit.MEGABYTES); //添加一个cache configuration.addCache(cacheConfiguration); configuration.dynamicConfig(false); //不允许动态修改配置信息 CacheManager cacheManager = new CacheManager(configuration); Cache cache = cacheManager.getCache("test"); cache.put(new Element("test", "test")); System.out.println(cache.get("test").getObjectValue());; }
3.以xml格式的配置对应的InputStream作为参数
通过Xml格式的配置对应的InputStream作为参数时,Ehcache会对Xml进行解析,然后构造一个对应的Configuration对象。
public void testInputStream() throws IOException { InputStream is = this.getClass().getClassLoader().getResourceAsStream("/ehcache.xml"); CacheManager cacheManager = new CacheManager(is); is.close(); System.out.println(cacheManager.getActiveConfigurationText()); }
4.以xml格式的配置文件对应的路径作为参数
指定xml格式的配置文件对应的路径后,Ehcache会获取指定路径对应的配置文件,然后获取其输入流,再利用InputStream的方式构造CacheManager。这里的路径可以是相对路径,也可以是绝对路径。
@Test public void testXmlPath() { //这个文件路径可以是相对路径,也可以是绝对路径。这里使用的是相对路径。 CacheManager cacheManager = new CacheManager("src/main/resources/ehcache/ehcache.xml"); System.out.println(cacheManager.getActiveConfigurationText()); }
5.以xml格式的配置对应的URL作为参数
以URL作为参数时,实际上ehcache还是通过获取URL对应的InputStream,然后再利用该InputStream以InputStream构造CacheManager的方式进行CacheManager的构造。
@Test public void testURL() { URL url = this.getClass().getResource("/ehcache.xml"); CacheManager cacheManager = new CacheManager(url); System.out.println(cacheManager.getActiveConfigurationText()); }
1.2 静态方法构建
在CacheManager内部定义了一系列的用于构建CacheManager对象的静态方法。这主要可以分为两大类,一类是通过create()方法及其重载方法构建的,一类是通过newInstance()方法及其重载方法构建的。create()方法构建的都是单例,而newInstance()方法构建的可能是单例,也可能是多例。在CacheManager内部持有一个CacheManager类型的singleton对象,每次我们调用create()方法及其重载方法时,Ehcache都会判断当前的singleton对象是否非空,如果非空则直接返回,否则则以相应的配置构建一个CacheManager对象赋给singleton并进行返回。在调用newInstance()方法及其重载方法构建CacheManager时,Ehcache首先会判断我们之前是否创建过且还存在同样名称的CacheManager对象,如果有则直接返回该CacheManager对象,否则将新建一个CacheManager进行返回。所以调用CacheManager的newInstance()系列方法构建CacheManager与直接调用CacheManager的构造方法构造CacheManager对象的区别就在于调用newInstance()系列方法时如有同名的存在,会直接返回先前的,而不会抛出异常。此外CacheManager内部还定义了一个getInstance()静态方法,调用它时相当于是调用了不带参数的create()方法。
1.create()方法
在CacheManager内部一共定义有五个create()方法,分别对应于CacheManager的五个newInstance()方法,而每一个newInstance()方法又对应于CacheManager对应的构造方法。在调用时Ehcache会先判断CacheManager内部持有的singleton是否为空,非空则直接返回singleton,否则将返回对应参数的newInstance()返回的实例对象并赋值给singleton。
public void test() { //以默认配置创建一个CacheManager单例 CacheManager cacheManager = CacheManager.create(); //以config对应的配置创建CacheManager单例 Configuration config = ...;//以某种方式获取的Configuration对象 cacheManager = CacheManager.create(config); //以configurationFileName对应的xml文件定义的配置创建CacheManager单例 String configurationFileName = ...;//xml配置文件对应的文件名称,包含路径 cacheManager = CacheManager.create(configurationFileName); //以is对应的配置信息创建CacheManager单例 InputStream is = ...; //以某种方式获取到的Xml配置信息对应的输入流 cacheManager = CacheManager.create(is); //以URL对应的配置信息创建CacheManager单例 URL url = ...; //以某种方式获取到的Xml配置信息对应的URL cacheManager = CacheManager.create(url); }
2.newInstance()方法
在CacheManager内部一共定义有五个newInstance()方法,分别对应于CacheManager的五个构造方法。在调用newInstance()方法时,Ehcache会查看CacheManager内部是否保存有曾经新建的且同名的CacheManager,如果有则返回该对象,否则构建一个新的CacheManager对象进行返回。所以newInstance()方法并不一定会产生一个新的对象。
public void test() { //以默认配置创建一个CacheManager CacheManager cacheManager = CacheManager.newInstance(); //以config对应的配置创建CacheManager Configuration config = ...;//以某种方式获取的Configuration对象 cacheManager = CacheManager.newInstance(config); //以configurationFileName对应的xml文件定义的配置创建CacheManager String configurationFileName = ...;//xml配置文件对应的文件名称,包含路径 cacheManager = CacheManager.newInstance(configurationFileName); //以is对应的配置信息创建CacheManager InputStream is = ...; //以某种方式获取到的Xml配置信息对应的输入流 cacheManager = CacheManager.newInstance(is); //以URL对应的配置信息创建CacheManager URL url = ...; //以某种方式获取到的Xml配置信息对应的URL cacheManager = CacheManager.newInstance(url); }
1.3 CacheManager的关闭
当我们不再需要使用CacheManager的时候,我们需要将CacheManager进行关闭。Ehcache为我们提供了一个关闭CacheManager的钩子,默认情况下是不可用的,通过设置系统属性net.sf.ehcache.enableShutdownHook=true就可以将该功能打开。但是官方还是推荐我们在程序里面调用CacheManager的shutdown()方法来将当前CacheManager进行关闭。
2 Cache
在Ehcache中定义了一个对缓存进行处理的接口叫Ehcache,Cache是Ehcache的一个实现类。Cache是由CacheManager进行管理的,使用CacheManager生成的就是一个Cache对象。Cache里面保存的是一个个的Element对象,这些对象通常都是保存在MemoryStore里面的,但也可以溢出到DiskStore。Element里面存放的是一个key和value的配对,其中key和value都是Object。Cache的创建可以事先在创建CacheManager的时候定义好,也可以在之后调用CacheManager实例的相关方法进行Cache的添加。Cache是线程安全的。
@Test public void test() { CacheManager cacheManager = CacheManager.create(); //以默认配置添加一个名叫cacheName的Cache。 cacheManager.addCache("cacheName"); Cache cache = cacheManager.getCache("cacheName"); Element ele = new Element("key", "value"); //把ele放入缓存cache中 cache.put(ele); }
2.1 Cache的创建
Cache的创建主要有两种方式,一种是通过Cache的构造方法创建,另一种是通过CacheManager创建。Cache中定义了一系列的构造方法,这里我们拿常用的利用CacheConfiguration来构造Cache做个示例。
@Test public void cache() { //内存中保存的Element的最大数量 int maxEntriesLocalHeap = 10000; CacheConfiguration cacheConfiguration = new CacheConfiguration("cacheName", maxEntriesLocalHeap); cacheConfiguration.overflowToOffHeap(false); Cache cache = new Cache(cacheConfiguration); //使用默认配置创建CacheManager CacheManager cacheManager = CacheManager.create(); //只有添加到CacheManager中的Cache才是有用的 cacheManager.addCache(cache); cache.put(new Element("key", "value")); System.out.println(cache.get("key")); }
注意:通过使用Cache的构造方法直接new出来的Cache一定要添加到CacheManager中才能使用。
通过CacheManager创建的Cache是指我们把Cache定义在CacheManager对应的配置信息里面,这样在创建CacheManager的时候也会把其中定义的Cache进行实例化并添加到对应的CacheManager中。根据构建CacheManager的方式不同,我们把Cache定义在CacheManager的配置信息中的方式也不同。总的来说有两种方式,一种是定义的对应的Xml格式的配置信息中,另一种是通过Configuration构建CacheManager时把CacheConfiguration添加到Configuration中。在之前介绍CacheManager的时候我们已经提到了在Ehcache配置文件中每一个cache元素代表一个Cache定义。简单示例如下:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <cache name="test" maxBytesLocalHeap="10M"/> </ehcache>
通过Configuration构建CacheManager时我们只需要把Cache定义即CacheConfiguration添加到Configuration中即可,示例代码如下:
@Test public void cache2() { CacheConfiguration cacheConfiguration = new CacheConfiguration(); cacheConfiguration.setName("test"); //指定cache名称 cacheConfiguration.setMaxBytesLocalHeap("10M"); //指定最大可用堆内存 Configuration config = new Configuration(); //构建一个空配置 //添加Cache配置信息到CacheManager的配置信息中 config.addCache(cacheConfiguration); CacheManager cacheManager = CacheManager.create(config); System.out.println(cacheManager.getOriginalConfigurationText()); Cache cache = cacheManager.getCache("test"); cache.put(new Element("key", "value")); }
2.2 Cache内容的CRUD
Cache内容的CRUD是指对Cache中保存的元素进行CRUD操作。
(1)新增元素
新增元素可以通过Cache的put(Element ele)方法来进行。Element是键值对形式,我们真正想要缓存的其实是Element的value,但是我们可以通过key来区别不同的value。同时Element中还包括我们缓存的一些额外信息,如缓存的时间等。Element的key和value类似于Map的key和value,均可为Object对象。
public class CacheCRUDTest { private CacheManager cacheManager; @Before public void before() { cacheManager = CacheManager.create(); cacheManager.addCache("cache"); } @After public void after() { cacheManager.shutdown(); } /** * 往Cache中新增元素 */ @Test public void create() { Cache cache = cacheManager.getCache("cache"); Element ele = new Element("key", "value"); //把ele放入缓存cache中 cache.put(ele); } }
(2)获取元素
获取元素的时候我们可以通过Cache的get()方法来进行的,其接收的参数是元素的key。
/** * 从Cache中读取元素 */ @Test public void read() { Cache cache = cacheManager.getCache("cache"); //通过key来获取缓存中对应的元素 Element ele = cache.get("key"); System.out.println(ele); if (ele != null) {//当缓存的元素存在时获取缓存的值 System.out.println(ele.getObjectValue()); } }
(3)更新元素
当我们在往Cache里面put元素的时候,如果Cache中已经存在相同key的元素了,则会用新的元素替换旧的元素,这也就意味着之前元素的一些信息将会丢失,如被查到的次数hitCount和创建时间等。
/** * 更新元素 */ @Test public void update() { Cache cache = cacheManager.getCache("cache"); cache.put(new Element("key", "value1")); System.out.println(cache.get("key")); //当添加元素的时候,如果缓存中已经存在相同key的元素则会将后者覆盖前者 cache.put(new Element("key", "value2")); System.out.println(cache.get("key")); }
此外,使用Cache的replace(Element ele)方法也可以更新Cache中对应的元素。与直接put更新不同的是,replace只会在Cache中拥有相同key的元素时才会对之前的元素进行更新。replace也会覆盖之前元素信息。
/** * 更新元素 */ @Test public void update() { Cache cache = cacheManager.getCache("cache"); cache.put(new Element("key", "value1")); System.out.println(cache.get("key")); //替换元素的时候只有Cache中已经存在对应key的元素时才会替换,否则不操作。 cache.replace(new Element("key", "value2")); System.out.println(cache.get("key")); }
(4)删除元素
删除元素是通过Cache的remove()方法进行的,其接收所要删除元素的key作为参数。
/** * 根据key来移除一个元素 */ @Test public void delete() { Cache cache = cacheManager.getCache("cache"); //根据key来移除一个元素 cache.remove("key"); System.out.println(cache.get("key")); }
(本文是基于Ehcache2.8.1写的)
相关推荐
- **TestEhcache.zip**:这个项目可能是一个简单的Ehcache使用示例,演示了如何创建和操作缓存,包括缓存的存取、更新、删除等基本操作。通过阅读源代码和运行程序,可以直观地理解Ehcache的基本功能。 - **...
标题“memcached完全剖析ehcache memcached redis 缓存技术总结”表明,这篇内容将深入探讨三种流行的缓存技术——Memcached、Ehcache和Redis。缓存是IT行业中用于提高系统性能的关键技术,尤其是在大数据量和高并发...
最近新学习了前端框架Layui、安全框架Shiro、缓存框架Ehcache的基本用法,边学习边练习,写了这个学生管理系统。 ### 介绍 该系统相对于以前的练手项目,最主要就是新增了shiro权限。我在菜单栏用了shiro标签...
总的来说,`database jndi setting ehcache`涉及到了Java应用的两大关键组件——数据库连接管理和高效的缓存机制。理解并正确配置这两个部分,对于优化应用性能、提高系统可用性至关重要。通过阅读和理解上述配置...
通过本文的介绍,我们可以看到Spring整合EhCache的过程不仅包括了基本的缓存配置,还涉及到了对Spring缓存抽象的理解以及如何利用注解驱动的方式来简化缓存管理。通过合理的缓存策略和恰当的技术选型,可以在很大...
**Hibernate使用——入门** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这篇博文将引导你入门Hibernate,理解其基本概念和使用方法。 **1. Hibernate概述** ...
1. 第二级缓存:通过引入第三方缓存插件(如 Ehcache),提升数据访问速度,减少对数据库的直接操作。 2. 批量操作:利用Hibernate的批处理功能,提高插入、更新和删除的效率。 3.延迟加载(Lazy Loading):只在...
我在菜单栏用了shiro标签对菜单进行控制,根据登录用户的不同,显示不同的菜单和操作按钮。 新接触的Layui的表单可以说是非常实用了,但是我用ehcache缓存对list集合进行缓存时,layui的表格分页功能就会失效(比如...
《JiveJdon——3.1:Java学习的宝贵资源》 在编程世界里,Java是一种广泛应用的编程语言,尤其在企业级应用开发领域占据着举足轻重的地位。"JiveJdon"是一个专为Java爱好者和学习者提供的论坛源代码,它为我们提供...
### 缓存技术详解——基于Ehcache开源框架的关键知识点 #### 一、Ehcache简介及背景 Ehcache是一种高性能、易于使用的开源缓存框架,最初与Hibernate项目紧密相关,随后发展成为独立的缓存解决方案。它旨在提供一...
通过以上步骤,你可以构建一个基本的JSP + DAO实现的留言管理系统。这种架构模式在实际项目中很常见,有助于保持代码的整洁和模块化。同时,随着项目复杂度的增加,还可以引入Service层和Spring框架来进一步提升代码...
为了更好地理解Ehcache在系统中的实际操作,以下是一些基本操作的步骤: - **添加测试缓存区**:在代码中创建一个新的缓存区域,指定其大小和过期时间等属性。 - **向缓存区添加数据**:使用Ehcache提供的API将...
CMS系统通常需要与数据库进行大量交互,JSPGenCMS3可能使用了Java Database Connectivity (JDBC) API来连接和操作数据库,如MySQL或Oracle,进行内容存储和检索。 5. **用户认证与权限管理**: 内容管理系统通常...
2. **ObjectCache.java**:这个名字可能表示一个对象级别的缓存,可能封装了Ehcache的实例并提供了操作缓存的基本接口。它可能包含添加、删除、更新和查找缓存项的函数,同时处理Ehcache的一些配置和管理任务,比如...
【描述】:本文将深入探讨三个广泛使用的缓存系统——Ehcache、Memcached 和 Redis,分析它们的特点、优缺点以及适用场景,帮助读者理解这三大“缓存男高音”的差异,并提供实践建议。 【标签】:互联网 【正文】...
《Java之Hibernate视频教程》是一份详尽的教育资源,旨在帮助学习者深入理解并掌握Java中的持久化框架——Hibernate。Hibernate作为一个开源的对象关系映射(ORM)工具,它极大地简化了Java应用程序对数据库的操作,...
Session提供了增删改查(CRUD)的基本操作,如save()、update()、delete()以及get()和load()方法。同时,Session还支持事务管理,确保数据的一致性。 其次,Configuration类是初始化Hibernate的重要组件,它负责...
1. **简介与安装**:这部分会介绍Hibernate的基本概念、发展历程以及如何在项目中配置和安装Hibernate。通常包括添加依赖库、配置Hibernate的XML文件(如hibernate.cfg.xml)以及初始化SessionFactory等步骤。 2. *...
还有Criteria API的子集——Detached Criteria,可以在不与数据库交互的情况下预先构建查询条件。 缓存(Caching)是提升Hibernate性能的关键。一级缓存是由Session管理的,它存储了最近访问过的对象,避免了频繁的...
【hibernate3 教程】是针对Java开发人员的一款持久化框架——Hibernate的学习资源,主要以PPT的形式呈现。Hibernate作为一个对象关系映射(ORM)框架,它为Java应用程序提供了一种方便、高效的方式,将数据库操作...