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

05-04-25 aill
    

问题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"/>
<p>

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

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

还有另一个问题

能不能使用static变量和方法来缓存数据呢

例如

class Cache{
static HashMap hm;
static getObject(){};
}
<p>

这样我们在所有需要使用的时候只要用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容器讲座中谈到单态的问题。