EhCache 缓存嵌入对象问题

心灯 发布于 2012/03/10 23:23
阅读 5K+
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

问题是这样的

我想把下面的book对像(含Factory属性)使用缓存ehcache缓存起来,但是总是报错,相信是我的使用方式不对,或是此路不通吧,有没有什么好的办法可以实现这样的想法呢,多谢了  

public class Factory {
	private String Address;

	public Factory(String address) {
		super();
		Address = address;
	}

	public String getAddress() {
		return Address;
	}

	public void setAddress(String address) {
		Address = address;
	}
}

public class Book implements Serializable {
	private String bookName;
	private Factory factory;
	public Factory getFactory() {
		return factory;
	}
	public void setFactory(Factory factory) {
		this.factory = factory;
	}
	public Book(String bookName) {
		this.bookName = bookName;
	}
	public String getBookName() {
		return bookName;
	}
}

Ehcache使用方法

CacheManager manager1 = new CacheManager();
		String[] cacheNamesForManager1 = manager1.getCacheNames();
		
		Cache cache = manager1.getCache("sampleCache1");		
		Book b = new Book("Music Book");
		b.setFactory(new Factory("china"));
		Element element1 = new Element("book", b);
		cache.put(element1);

报错内容

012-3-10 23:23:06 net.sf.ehcache.store.disk.DiskStorageFactory$DiskWriteTask call
严重: Disk Write of book failed: 
java.io.NotSerializableException: com.domain.ehcache.Factory
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
	at net.sf.ehcache.Element.writeObject(Element.java:797)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at net.sf.ehcache.util.MemoryEfficientByteArrayOutputStream.serialize(MemoryEfficientByteArrayOutputStream.java:97)
	at net.sf.ehcache.store.disk.DiskStorageFactory.serializeElement(DiskStorageFactory.java:413)
	at net.sf.ehcache.store.disk.DiskStorageFactory.write(DiskStorageFactory.java:392)
	at net.sf.ehcache.store.disk.DiskStorageFactory$DiskWriteTask.call(DiskStorageFactory.java:493)
	at net.sf.ehcache.store.disk.DiskStorageFactory$PersistentDiskWriteTask.call(DiskStorageFactory.java:1154)
	at net.sf.ehcache.store.disk.DiskStorageFactory$PersistentDiskWriteTask.call(DiskStorageFactory.java:1138)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

 

加载中
0
红薯
红薯
进入缓存的对象必须实现  java.io.Serializable 接口。
onse
onse
该评论暂时无法显示,详情咨询 QQ 群:点此入群
onse
onse
@红薯 : 好的,已经发了!
红薯
红薯
@senge : 重新发个提问帖,把问题详细描述下,附代码
onse
onse
@红薯 : 我用的是最新有2.5的ehcache
onse
onse
@红薯 : cm.getKeys() 得到的size=0?不知道是为什么,怎么也存不进去哦!求解?
下一页
0
心灯
心灯

这么晚还在呀,多谢回复呀,如果是这样的话我这个路子就行不通了。其实我是有这样的一个需要:

用netty做一个服务器,把连接过来的上下文变量缓存在缓存中,另一个发送的线程直接读该缓存就成了,所以想到用ehcache,但这个老兄你的说法我的这个使用应该是行不通的。那针对我这个想法有什么好的建议没有,多谢!

netty 服务器框架图

0
心灯
心灯
当然上面的
ChannelHandlerContext 变量可以在连接的时候装在 ConcurrentMap<String, MyClient>中,但这样就有个限制,如果我发送的线程如果在另一个服务器上面的问题。
0
PaulWong
PaulWong
public class Factory implements Serializable
0
PaulWong
PaulWong
另EHCACHE支持分布式。
0
心灯
心灯

@PaulWong 多谢了!

我要缓存 ChannelHandlerContext  但他又没有实现Serializable,所以我上面的想法是不成立的。EHCACHE支持分布式这个我知道,关键是ChannelHandlerContext 对像无法缓存,所以我想像的方案是不可行的,我上图的本意是为了解决高并发时的思路,看来行不能,只能从Haproxy+keepalived来思考一下方案

0
linke
linke
java.io.NotSerializableException: com.domain.ehcache.Factory  很明显嘛,,,
0
Jimmm
Jimmm

引用来自“心灯”的评论

这么晚还在呀,多谢回复呀,如果是这样的话我这个路子就行不通了。其实我是有这样的一个需要:

用netty做一个服务器,把连接过来的上下文变量缓存在缓存中,另一个发送的线程直接读该缓存就成了,所以想到用ehcache,但这个老兄你的说法我的这个使用应该是行不通的。那针对我这个想法有什么好的建议没有,多谢!

netty 服务器框架图

虽然好久了,我可以回答一下吗,你可以序列化反序列化。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部