问题就是:缓存到硬盘,关闭服务器后再重启,无法获得之前缓存数据
环境:
ehcache版本:
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.5.2</version> </dependency>
ehcache.xml:
<?xml version="1.0" encoding="UTF-8"?> <ehcache name="spring_oa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"> <!-- <diskStore path="java.io.tmpdir"/> Java临时目录 --> <diskStore path="d:\cache"/> <!-- Java临时目录 --> <!-- 配置自定义缓存 maxElementsInMemory:缓存中允许创建的最大对象数 eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。 timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前, (空闲时间) 两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效, 如果该值是 0 就意味着元素可以停顿无穷长的时间。 timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值, 这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。 overflowToDisk:内存不足时,是否启用磁盘缓存。 memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。 --> <!-- My understanding is that the "default cache" is actually a template for new caches that get created, rather than being a specific named cache. --> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"/> <!-- 最大日期缓存到磁盘--> <!-- 警情 --> <cache name="jq_maxDateCache" maxElementsInMemory="1" eternal="true" overflowToDisk="true" diskPersistent="true" memoryStoreEvictionPolicy="LFU" > <!-- timeToIdleSeconds="60" --> <!-- timeToLiveSeconds="0" --> <!-- overflowToDisk="false" --> <!-- statistics="true" --> <BootstrapCacheLoaderFactory class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory" properties="bootstrapAsynchronously=true" /> <!-- <cacheEventListenerFactory --> <!-- class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" /> --> <!-- 比一般配置多了这个 --> <!-- <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> --> </cache> <!-- 最大日期缓存到磁盘--> <!-- 调派中队 --> <cache name="dpzd_maxDateCache" maxElementsInMemory="1" eternal="true" overflowToDisk="true" diskPersistent="true" memoryStoreEvictionPolicy="LFU" > <BootstrapCacheLoaderFactory class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory" properties="bootstrapAsynchronously=true" /> <!-- <cacheEventListenerFactory --> <!-- class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" /> --> <!-- 比一般配置多了这个 --> <!-- <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> --> </cache> <!-- 最大日期缓存到磁盘--> <!-- 调派车辆 --> <cache name="dpcl_maxDateCache" maxElementsInMemory="1" eternal="true" overflowToDisk="true" diskPersistent="true" memoryStoreEvictionPolicy="LFU" > <BootstrapCacheLoaderFactory class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory" properties="bootstrapAsynchronously=true" /> <!-- <cacheEventListenerFactory --> <!-- class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" /> --> <!-- 比一般配置多了这个 --> <!-- <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> --> </cache> </ehcache>
applicationContext-cache.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Spring提供的基于的Ehcache实现的缓存管理器 --> <!-- 如果有多个ehcacheManager要在bean加上p:shared="true" --> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache/ehcache.xml"/> </bean> <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcache"/> </bean> </beans>
CacheUtils:
package jiangdu.fire.util.wj; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cache.ehcache.EhCacheCacheManager; import org.springframework.util.CollectionUtils; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; /** * Cache工具类 * @author wj * @date 2016-12-31 */ public class CacheUtils { private static Logger logger = LoggerFactory.getLogger(CacheUtils.class); private static EhCacheCacheManager cacheManager = SpringContextHolder.getBean("ehcacheManager"); public static Object get(String cacheName, Object key) { Cache cache = getCache(cacheName); if (cache != null) { logger.debug("------缓存["+cacheName+"] size:"+cache.getSize()); // System.out.println("------缓存["+cacheName+"] size:"+cache.getSize()); List<String> keys = cache.getKeys(); if(!CollectionUtils.isEmpty(keys)){ for( String key1 : keys){ logger.debug("------缓存["+cacheName+"] key:"+key1+",value:"+cache.get(key1).getObjectValue()); // System.out.println("------缓存["+cacheName+"] key:"+key1+",value:"+cache.get(key1).getObjectValue()); } } Element element = cache.get(key); if (element != null) { return element.getObjectValue(); } } return null; } public static void put(String cacheName, Object key, Object value) { Cache cache = getCache(cacheName); if (cache != null) { cache.put(new Element(key, value)); } } public static boolean remove(String cacheName, Object key) { Cache cache = getCache(cacheName); if (cache != null) { return cache.remove(key); } return false; } public static void flush(String cacheName) { Cache cache = getCache(cacheName); if (cache != null) { cache.flush(); } } public static void main(String[] args) { String key = "key"; String value = "hello"; CacheUtils.put("mytest", key, value); System.out.println(CacheUtils.get("mytest", key)); } /** * 获得一个Cache,没有则显示日志。 * @param cacheName * @return */ private static Cache getCache(String cacheName){ Cache cache = cacheManager.getCacheManager().getCache(cacheName); if (cache == null){ throw new RuntimeException("当前系统中没有定义“"+cacheName+"”这个缓存。"); } return cache; } }
写入缓存代码:
//TODO 可以比较一下缓存里的日期和这里的最大日期 //将最大日期缓存磁盘(用于防止server关闭)。如果没有关闭,最大日期值 依然在外面静态变量里 CacheUtils.put(cacheName, cacheKeyName,maxBjsj); //看看有没有持久化成功 org.springframework.util.Assert.isTrue(comparDate(((AtomicReference<Date>)CacheUtils.get(cacheName, cacheKeyName)).get(), maxBjsj.get())==0 ,"缓存日期和刚才日应该相等"); CacheUtils.flush(cacheName);
读缓存代码:
static{ if(CacheUtils.get(Contants.jq_maxDateCache, Contants.jq_maxDate_key) == null){ maxBjsj = new AtomicReference<Date>(); }else{ maxBjsj = (AtomicReference<Date>)CacheUtils.get(Contants.jq_maxDateCache, Contants.jq_maxDate_key); } }
这时候,如果server关闭再开启,会读不到数据。
解决:
1、we.xml 加入
<listener> <listener-class>net.sf.ehcache.constructs.web.ShutdownListener</listener-class> </listener>
让服务器关闭时候,调ehcache的shutdown方法。
2、spring 启动的时候
System.setProperty(net.sf.ehcache.CacheManager.ENABLE_SHUTDOWN_HOOK_PROPERTY,"true");
public class SpringInit implements InitializingBean, ServletContextAware{ private static Logger logger = LoggerFactory.getLogger(SpringInit.class); @Override public void setServletContext(ServletContext servletContext) { logger.debug("-----init-----"); System.setProperty(net.sf.ehcache.CacheManager.ENABLE_SHUTDOWN_HOOK_PROPERTY,"true"); } @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub } }
再把该BEAN配置到applicationContext.xml里面
<bean class="jiangdu.fire.util.wj.SpringInit"> </bean>
。如果还不行可以改源码,修改DiskStorageFactory.DiskStorageFactory(..)方法,注释掉最后的 else if,让其不删除.index文件。
我这样就可以了。然后,server运行时候,.data文件是0kb的,server关闭后,.data文件就有内容了。。。不明所以
可以参考:http://blog.csdn.net/kingofworld/article/details/44751029
----
但是运行一段时间后,在put缓存的时候,会报EOFException,但是我对象都序列化了啊。
相关推荐
-- 是否保存到磁盘,当系统当机时--> timeToIdleSeconds="300" !-- 当缓存闲置n秒后销毁 --> timeToLiveSeconds="180" !-- 当缓存存活n秒后销毁--> diskPersistent="false" ...
`RuntimeMessage.java`可能是一个包含运行时消息处理的类,与Ehcache缓存的具体实现关系不大,但可能在实际应用中与缓存配合使用,例如处理缓存未命中时的异常情况。 至于`ehcache.jar`,它是Ehcache的库文件,包含...
**Ehcache缓存** Ehcache是一种广泛使用的开源Java分布式缓存系统,它为高性能应用程序提供了内存存储和缓存解决方案。在Java世界中,尤其是在持久化框架如Hibernate的使用中,Ehcache扮演了至关重要的角色。由于...
此外,Ehcache还具备在虚拟机重启后自动将缓存数据持久化到磁盘的功能,确保了数据的可靠性。 在分布式环境中,Ehcache通过使用JGROUP来实现分布式缓存。JGROUP是一个用于构建可靠集群通信的库,可以提供组成员资格...
为了提高性能和减少对数据库的直接访问,MyBatis 提供了缓存功能,而Ehcache 是一个广泛使用的开源Java缓存库,可以集成到MyBatis 中以实现高效的缓存管理。 在MyBatis 中添加Ehcache 缓存支持,首先需要确保项目...
2. **持久化**:Ehcache可以配置持久化机制,将缓存数据保存到磁盘,即使在服务器重启后仍能恢复数据。 3. **分布式缓存**:Ehcache支持分布式部署,通过 Terracotta Server 集群,可以在多台服务器间共享和同步...
Ehcache 是一个流行的 Java 缓存框架,提供了强大的缓存机制,帮助开发者提高应用程序的性能和可扩展性。 Ehcache 的配置主要包括 diskstore、defaultCache、cache 三个部分,这三个部分的配置将决定 ehcache 的缓存...
默认情况下,磁盘缓存不会保存至下一次启动,但如果设置`diskPersistent`为`true`,则可以在重启后恢复之前的缓存状态。 7. **`diskExpiryThreadIntervalSeconds`**:磁盘缓存清理线程的运行间隔,单位为秒。默认为...
Ehcache缓存简介 1、基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速、上手简单等特点,是Hibernate中默认的缓存提供方。 2、Hibernate缓存 Hibernate三级缓存机制简介: 一级缓存:基于Session级别分配...
**EHcache缓存框架** EHcache是一款开源的Java缓存框架,它被广泛应用于提高应用程序的性能和响应速度,通过存储频繁访问的数据到内存中,避免了每次请求时都进行昂贵的数据库查询。EHcache的设计目标是轻量级、高...
2. 在Spring配置文件中配置Ehcache缓存管理器。 3. 在需要缓存的方法或类上添加`@Cacheable`、`@CacheEvict`等注解。 4. 可选:配置缓存切面,如`@EnableCaching`。 **5. 性能优化** - 选择合适的缓存策略(LRU、...
这里配置了一个名为“users”的缓存,最大本地堆内存条目为100,不溢出到磁盘。 3. **启用EhCache**: 在Spring Boot的主配置类上添加`@EnableCaching`注解,并通过`spring.cache.type=ehcache`属性指定使用...
4. **缓存预热**:EhCache允许开发者预加载一部分数据到缓存中,以便在应用启动后快速提供服务。 5. **缓存同步**:在多线程环境中,EhCache提供了线程安全的访问控制,确保并发操作下的数据一致性。 6. **API与...
Ehcache是一个流行的Java缓存库,用于在应用程序中存储数据,以提高性能并减少对数据库的访问。它被广泛应用于各种系统,特别是在处理大量数据和需要快速响应时间的应用中。下面将详细介绍Ehcache的核心概念、配置...
Ehcache 是一款广泛应用于Java开发中的开源缓存框架,其高效、易用且功能强大的特点使其在处理大量数据快速访问的问题上表现出色。本文将详细介绍Ehcache的基础知识、配置以及如何在实际项目中应用。 1. **Ehcache...
ehcache具有可扩展性,支持磁盘存储、缓存过期策略、缓存更新监听等功能。 **环境搭建** 1. **添加依赖**:首先,你需要在项目的pom.xml或build.gradle文件中添加ehcache的依赖。确保版本与Hibernate版本兼容。 2...
Ehcache 作为一款强大且灵活的缓存框架,不仅提供了高效的内存缓存,还支持磁盘存储和分布式缓存,广泛应用于 Java 开发领域。通过深入学习 Ehcache 的配置、使用、源码及工具,开发者可以更好地利用缓存提升应用...
### EHCache缓存知识点详解 #### 一、EHCache简介 **EHCache** 是一个用 Java 实现的高效、简洁的缓存管理类库。它不仅适用于开发高性能的应用程序,而且由于其实现了线程安全,因此非常适合在多线程环境中使用。...
在这个“ehcache缓存入门项目”中,我们将深入探讨EhCache的基本概念、配置、使用方法以及一些实用技巧。 1. **EhCache简介** EhCache是一个基于内存的分布式缓存解决方案,它可以存储对象并提供快速访问。它支持...