请教关于jive缓存的问题,大家来帮忙啊

    
vic
03-01-13 8 378

jive中的缓存机制是根据使用大小来控制是否该将一个新创建的对象加入
到内存池中的。每个需要被缓存的对象必须implements Cacheable接口,
并且实现getSize()方法返回该对象占用的内存大小,供回调时使用。
对于只是由类型(String, int, long...)组合而成的对象使用起jive的
缓存机制能够比较准确的控制内存的使用,但是对于一个业务对象是由
其他几个业务对象组合而成的情况就很难控制内存使用量了,例如:
有A,B三个类,只有A需要缓存

class A implements Cacheable {
B b = new B();
String s = "aaa";
public void getSize() {
//这里就无法精确返回A对象的大小了
return 4+s.length*2;
}
}

class B {}

这样,如果B的对象越大,那么误差越大,除非B也实现Cacheable接口,
并且在A.getSize()中调用B.getSize(),可很难确定在具体应用中业务
对象的包含层次以及数量,所以如果想精确控制,就需要将所有被用到
的业务对象都实现Cacheable,也就是很多本不需要实现cacheable的类
也被迫实现该接口,如果业务对象关系复杂,且种类繁多,那么如果想
达到精确控制,显然比较繁琐

我想,如果想比较精确的控制,对于jive这个cache实现机制,只能自己
不厌其烦的实现Cacheable,因为实现机制是根据容量来控制的,所以
getSize()方法是保证控制精确性的必要条件。


1. 如果我仍然想基于内存使用量来控制,请问有没有更好的实现机制?
2. 有没有其他非(1)的好的缓存实现思路或已成型的框架?
3. 用于优化缓存的比较好的思路?

多谢!

banq
2003-01-14 10:25

其实对象一旦建立就在内存中,没有必要缓冲啊.

jive的缓冲其实是对论坛内容进行缓冲,这些数据平时在数据库中,基本都是String类型的.

vic
2003-01-15 19:23

1。“其实对象一旦建立就在内存中,没有必要缓冲啊.”
没理解你这句话的意思。

TmpCls tmp = new TmpCls();
没错,执行完上面一句内存中是创建了一个TmpCls的实例
tmp = null;
执行完这一句,GC可能在某个时候就把上面创建的实例给回收了

2。我和jive的需求类似,都是要把常用的对象缓存起来,提高效率
但是,jive实现缓存的根本是通过实现cacheable接口的getSize()
方法来控制内存的使用量。但是如根贴里我描述的,如果业务对象
之间关系复杂,那么getSize()实现就很繁琐

所以,我是在问,对于cache实现上有没有其他什么好的思路?

hxz
2003-01-16 10:00

我想:既然你的对象已经在内存中了,为什么你还要缓冲。jive只是数据库数据的缓存!

对于对象你一定时刻把计算内存中的对象数目,并把多余的对象tmp=null的话,那你的需求就不是和jive一样了!应该是ejb容器的需求一样了,那就得看jboss!它应该是采用某种陶汰算法,把对象序列化!

banq
2003-01-16 11:13

to vic
你不必 将对象指向清空,而是将其保存在一个hashmap中,这样垃圾回收站就永远不会清除,你需要用某个对象时,根据索引到hashmap查询调用就可以。

如果在多个计算机之间共享这个对象,就可以通过多种办法共享。


你的问题是关于对象持久化的问题,请看我推荐的文章:


http://www.jdon.com:81/jive/thread.jsp?forum=121&thread=4536

2Go 1 2 下一页