使用EhCache将对象put进缓存后,get出来为null的问题

使用EhCache将对象put进缓存后,get出来为null的问题

问题

以前使用EhCache缓存数据的时候,保存的value都是基于Java的基础类型数据,最近发现保存自定义类型的对象时,get()出来的Element要么为null,要么当用Element的getValue()时抛出net.sf.ehcache.CacheException: Value xxx is not Serializable异常。

解决方案

  1. EhCache在put对象时,该对象必须是可序列化(Serializable)的类型,也就是说要实现java.io.Serializable。因为EhCache在put对象时,是序列化保存的。
    官方文档对EhCache put方法的说明

    put

    void put(Element element)throws IllegalArgumentException,IllegalStateException,CacheException
    Put an element in the cache.
    Resets the access statistics on the element, which would be the case if it has previously been gotten from a cache, and is now being put back.

    Also notifies the CacheEventListener that:

    the element was put, but only if the Element was actually put.
    if the element exists in the cache, that an update has occurred, even if the element would be expired if it was requested
    Parameters:
    element - An object. If Serializable it can fully participate in replication and the DiskStore.

    Throws:
    IllegalStateException - if the cache is not Status.STATUS_ALIVE
    IllegalArgumentException - if the element is null
    CacheException

另外:EhCache的flush()方法是将缓存序列化到文件中, 缓存配置diskPersistent=“true"时有用。如果put没有序列化的对象后再flush(),从Cache中get()将得到null(不支持序列化对象,没法持久化到文件中)。如果put后没有flush(),则可以get()到缓存的Element,但是当调用Element的getValue()取缓存对象时,会报net.sf.ehcache.CacheException: Value xxx is not Serializable异常。

时间: 2024-08-26 22:02:35

使用EhCache将对象put进缓存后,get出来为null的问题的相关文章

项目搭建系列之三:SpringMVC框架下使用Ehcache对象、数据缓存

注明:该文章为以前写的文章,这里只更改了标题,无GitHub源码下载. 一.准备工作 如果已经成功搭建SpringMVC环境,那么就可以进入Ehcache的准备工作了.1.下载jar包    Ehcache 对象.数据缓存:    http://ehcache.org/downloads/destination?name=ehcache-2.9.0-distribution.tar.gz&bucket=tcdistributions&file=ehcache-2.9.0-distribut

Hibernate 持久化对象和一级缓存

关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识OID,没有纳入Session的管理. 2.Persistent持久态:持久化对象有唯一标识OID,已经纳入到Session的管理,另外,持久化具有自动更新数据库的特点 3.Detached脱管态:持久化对象有唯一标识OID,没有纳入到Session管理. 下面给出一段代码来区分这三种状态: 1 /

ehcache模糊批量移除缓存

目录 前言 实现 总结 前言 众所周知,encache是现在最流行的java开源缓存框架,配置简单,结构清晰,功能强大.通过注解@Cacheable可以快速添加方法结果到缓存.通过@CacheEvict可以快速清除掉指定的缓存. 但由于@CacheEvict注解使用的是key-value的,不支持模糊删除,就会遇到问题.当我用@Cacheable配合Spring EL表达式添加了同一方法的多个缓存比如: @GetMapping("/listOfTask/{page}/") @Cache

在重写了对象的equals方法后,还需要重写hashCode方法吗?

首先说建议的情况:  比如你的对象想放到Set集合或者是想作为Map的key时(非散列的Set和Map,例如TreeSet,TreeMap等),那么你必须重写equals()方法,这样才能保证唯一性.当然,在这种情况下,你不想重写hashCode()方法,也没有错.但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法. 然后再说说必须重写hashCode()的情况:     如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHa

循环保存的对象在事物提交后发现只保存了一个对象

有时候我们在使用事务循环保存多个对象时,可能会出现在提交事务后发现只保存了最后一个对象 例如 public void saveSystemDDL(SystemDDLPojo systemDDLPojo) {        String keywordname = systemDDLPojo.getKeywordname();        String[] ite = systemDDLPojo.getItemname();        String typeflag = systemDDLP

ios 将随意对象存进数据库

要将一个对象存进数据库的blob字段,最好先转为NSData.一个对象要遵守NSCoding协议,实现协议中对应的方法,才干转成NSData. NSData *statusData = [NSKeyedArchiver archivedDataWithRootObject:obj]; [_db executeUpdateWithFormat:@"INSERT INTO t_a(a, idstr) VALUES (%@, %@);", ajson, idstr];//假设将一个json字

金沐森:欲进汽车后市场请先了解行业痛点

汽车后市场正处在风口之上,不论是从"互联网+"中诞生的做上门洗车的服务也好,还是平时进店进行汽车维护服务也罢,上至资本大鳄下至个人汽配小店,惦记的都是汽车后市场这一万亿级别市场中的一杯羹.欲进汽车后市场,结局是一路凯歌,还是苦度春秋,甚至濒临倒闭?金沐森看来,深入彻底的了解行业"痛点",才是创业面临问题的重中之重. 什么是汽车后市场的真正需求 据了解,目前全国机动车总保有量达2.4亿辆,年增长1510万辆.其中,汽车保有量1.2亿辆,全国机动车驾驶人达2.6亿人.如

ios 将任意对象存进数据库

要将一个对象存进数据库的blob字段,最好先转为NSData,一个对象要遵守NSCoding协议,实现协议中相应的方法,才能转成NSData. NSData *statusData = [NSKeyedArchiver archivedDataWithRootObject:obj]; [_db executeUpdateWithFormat:@"INSERT INTO t_a(a, idstr) VALUES (%@, %@);", ajson, idstr];//如果将一个json字

Javascript-自定义对象转换成JSon后如何再转换回自定义对象

man是自定义的对象,使用var tim = JSON.stringify(man); var newman=JSON.parse(tim)后newman的类型是"object"并不是一个Man,怎么才能变回一个Man呢? function Man() { this._type = "man"; this.name=""; this.run = function () { alert("run!!"); alert(this.