JiveJdon Community Forums
在线216人   首页   主题总表   培训咨询   精华   查搜   注册    登陆
首页 » 论坛 » 开源JdonFramework及其应用案例论坛
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 8 回复 / 1
 发表新帖子   回复该主题贴
PinkFloyd

悄悄话
发表文章: 2
注册时间: 2003年10月31日 23:46
Jive与Ofbiz的Cache机制比较 请大家讨论 2003年10月31日 23:50 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表 缓存(86)     
Jive与Ofbiz都用实现了cache机制,两者的原理都很类似,就是把所要缓存的对象加到HashMap哈希映射表中,用两个链表分别维持着缓存对象

和每个缓存对象的生命周期。如果一个缓存对象被访问到,那么就把它放到链表的最前面,然后不定时地把要缓存的对象加入链表中,把过期

对象删除,如此反复。

在Jive(Jive2.6.0)中用到了cache\Cacheable\CacheObject\CacheSizes\DefaultCache\LinkdList\LinkdListNode等类;
而在Ofbiz中,只用了一个类:UtilCache!!

在此比较一下他们的实现差异:

1、在Jive中有一个cacheable接口,只有一个方法getCachedSize()

public interface cacheable extends Serializable {
public int getCachedSize();
}

所有需要cache的对象都必须implements该接口并实现getCachedSize(),其目的是为了在缓存的时候得到对象的大小。
当调用DefaultCache中的put方法的时候,会得到该对象的大小:

public synchronized Object put(Object key, Object value)
{
remove(key);
int objectSize = calculateSize(value);
if(maxCacheSize > 0 && (double)objectSize > (double)maxCacheSize * 0.9)
{
Log.warn("Cache: " + name + " -- object with key " + key + " is too large to fit in cache. Size is " +

objectSize);
return value;
} else
{
cacheSize += objectSize;
cacheObject cacheObject = new cacheObject(value, objectSize);
map.put(key, cacheObject);
LinkedListNode lastAccessedNode = lastAccessedList.addFirst(key);
cacheObject.lastAccessedListNode = lastAccessedNode;
LinkedListNode ageNode = ageList.addFirst(key);
ageNode.timestamp = System.currentTimeMillis();
cacheObject.ageListNode = ageNode;
cullCache();
return value;
}
}

protected int calculateSize(Object object)
{
if(object instanceof cacheable)
return ((Cacheable)object).getCachedSize();
......
}

而在Ofbiz中根本都不关心每个对象的Size,只关心总体的HashMap的Size,他的代码如下:

public synchronized void put(Object key, Object value) {
if (key == null)
return;

if (maxSize > 0) {
// when maxSize is changed, the setter will take care of filling the LRU list
if (cacheLineTable.containsKey(key)) {
keyLRUList.remove(key);
keyLRUList.addFirst(key);
} else {
keyLRUList.addFirst(key);
}
}

if (expireTime > 0) {
cacheLineTable.put(key, new UtilCache.CacheLine(value, useSoftReference, System.currentTimeMillis()));
} else {
cacheLineTable.put(key, new UtilCache.CacheLine(value, useSoftReference));
}
if (maxSize > 0 && cacheLineTable.size() > maxSize) {
Object lastKey = keyLRUList.getLast();
remove(lastKey);
}
}

个人觉得,Ofbiz中处理得更简洁,其实不就是判断缓存是否> maxSize吗!用HashMap.Size()我觉得足以了,而且对于Jive的方式,每个需要

Cache的对象必须implements cache接口,较麻烦。
当然是否有其他妙处就不得而知了,还请各位高人指点。

2、链表的问题也挺有意思,Jive为了实现双向联表用了两个类:LinkdList\LinkdListNode,记录最近访问的对象列表和按时间顺序排列的对象列表。
而在Ofbiz中用的是java.util.LinkedList:
public LinkedList keyLRUList = new LinkedList();
功能上好像也没有什么两样,不知道Jive问什么还要如此破费周折?还请各位高人指点。

3、Ofbiz中对象过时清除功能写得很一般,他是在get方法中实现的:

public Object get(Object key) {

UtilCache.CacheLine line = (UtilCache.CacheLine) cacheLineTable.get(key);

if (hasExpired(line)) {
//如果过期
remove(key);
line = null;
}

if (line == null) {
// remove掉后还要告诉我过期!!
missCount++;
return null;
}
}

Jive中实现的就巧妙多了,而且在这上面写得较精彩.

个人认为两者实现的功能相当,Ofbiz代码更简单,就是不知道两者的性能究竟怎样,请各位高人多多指教,请讨论。

sailingyangjian@hoatmail.com
PinkFloyd

悄悄话
发表文章: 2
注册时间: 2003年10月31日 23:46
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2003年11月05日 23:52 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
没有人研究过吗?
自己顶一下!
linxxtao

悄悄话
发表文章: 56
注册时间: 2003年09月18日 09:46
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2003年11月06日 09:23 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
对于第二个问题,我的感觉是,那个程序员是学C++出身的,对JAVA的包还不是很了解
banq

悄悄话
发表文章: 9312
注册时间: 2002年08月03日 17:08
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2003年11月06日 10:11 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
Jive的缓存因为知道数据大小,因此可以让管理者调节缓存大小,根据访问量大小调节,比较方便。缺点是重用性差,移植麻烦。

Ofbiz的缓存重用性很好,可以作为自己的系统缓存用,当然在缓存的精确控制上不及Jive。

使用哪一种缓存取决于自己的选择,关键是,这两种缓存不支持分布式,要实现分布式缓存就相当复杂,Jive 3.0以后就使用了一个非开源的分布式缓存产品。TTS也是。
javaw

悄悄话
发表文章: 6
注册时间: 2003年10月29日 13:46
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2003年11月07日 20:29 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
PinkFloyd,老大能否上传一份ofbiz源码?
水雨澍

悄悄话
发表文章: 46
注册时间: 2003年10月07日 00:07
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2003年11月09日 23:47 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
最近在我自己的网站上运用了类似于JIVE的cache实现,但感觉和直接操作数据库的速度差不多!
好象JIVE当中cache的移植并不难啊,UTIL包都可以直接拿到自己的系统中使用啊。
niko

悄悄话
发表文章: 7
注册时间: 2003年11月24日 16:07
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2004年04月29日 17:36 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
现在用nio包实现的mmf我觉得会更好
北飘宝宝

悄悄话
发表文章: 14
注册时间: 2004年04月21日 11:27
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2004年04月30日 08:17 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
有人有ofbiz的源码吗?大家一起研究一下
ggzzkk

悄悄话
发表文章: 1
注册时间: 2004年11月01日 16:51
Re: Jive与Ofbiz的Cache机制比较 请大家讨论 2004年11月01日 17:00 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
to banq

请问你知道jive3.0用的那个缓存包叫什么名字吗?那里有下载的。谢谢了。
这个主题有 8 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam