b/s系统下,缓存的使用策略???

aill 05-04-25
    

问题1:在jdon上逛了很久,看到很多关于缓存的帖子,一般是把对象和对象id保存到缓存类(Cache)的HashMap里;
但是我有个问题一直想不通,要让bs系统下的所有类都获取同一个Cache类(不能在每个Servlet里都Cache cache=new Cache()吧,那就没意义了)要如何实现,我看了Jive的源代码
在global.jsp里
<jsp:useBean id="myEnv" scope="application" class="com.jdon.web.UserEnvFront"/>
在UserEnvFront类里
public class UserEnvFront
{
private ForumFactory forumFactory;
private User pageUser;
。。。。。。。。。
}
ForumFactory好像就是板块页面的缓存类

同时在其他jsp页面里使用
<%@ include file="global.jsp" %>
这样就能使用唯一的myEnv实例,同时使用唯一的缓存类ForumFactory.

是不是所有设计到全局性的变量或引用都要放到类似UserEnvFount的类里
然后被jsp实例化在被其他jsp或servlet使用,这样好像是将myEnv放在了用户的Session里,当myEnv里的东西太多(例如缓存了很多页面)的时候会不会影响系统性能?
请问我的理解对吗?
有没有其他方案呢?(使用类的静态变量和静态方法可以吗,这样我们引用的时候就可以这样 Cache.getObject(),?)

问题2:
bang说过"无状态Session bean可以来充当缓存的作用"
这个我就不理解了,无状态Session bean的实例都是相同的,如果我们把需要缓存的东西放到一个Session bean里,那么我们获取的时候,系统会从缓冲池随机获取一个返回给用户,如果返回的不是我们刚才设置的Session bean呢,而且Session bean是容器管理的,如果我们长时间不用,我们的用来缓存Session bean会不会容器销毁呢?
从性能来说,我们每次使用缓存的时候都使用lookup查找,这样是不是没效率,背离了缓存的初衷呢(当然我们也可以把bean的home保存起来,但是这样好像又使用了第一种缓存机制)?

麻烦bang等大虾指点一下,谢谢了!

    

banq
2005-04-25 10:06

缓存策略是非常复杂的,我一直认为,掌握了缓存机制,标志程序员进入中高级阶段。

我只能就你的问题回答,如果来龙去脉要描述就很长了。我有一个专门培训课程是全面介绍J2EE系统缓存体系的。scope掌握是关键。

>所有类都获取同一个Cache类
scope:这个生存周期设定成Apllication

>无状态Session bean可以来充当缓存
scope:只适合Session bean内部使用的。

aill
2005-04-25 13:27

谢谢bang的回复

我的帖子里的jsp代码没显示出来,我看了jive是在global里使用

<jsp:useBean id="myEnv" scope="application" class="com.jdon.web.UserEnvFront"/>

然后在myEnv里保存全局变量和缓存类的

关于无状态Session bean作缓存就先不管了,因为自己还没到那水平:)

还有另一个问题
能不能使用static变量和方法来缓存数据呢
例如


class Cache{
static HashMap hm;
static getObject(){};
}

这样我们在所有需要使用的时候只要用Cache.getObject()就可以了,

不知道这种办法可行吗,再次麻烦bang了

aill
2005-04-25 13:29

怎么我的jsp代码就是显示不出来
<j s p:useBean id="myEnv" scope="application"
> class="com.jdon.web.UserEnvFront"/>

banq
2005-04-27 11:39

>能不能使用static变量和方法来缓存数据呢
静态和单态是传统缓存数据的方法,但是问题多多,在J2EE中建议使用Application实现,如果有兴趣,我曾经在Ioc容器讲座中谈到单态的问题。