session bean中的session如何理解?

03-09-22 wlkid
对于HttpSession很好理解,从客户第一次访问到关闭浏览器或者超时,是为一个session,那对EJB而言又如何界定session的边界,又如何表示客户的呢?是从create()到remove()么?可一般情况下会显式的去调用remove么,比如在Servlet中,如果这样的话,sfsb何时失效(等待EJB Container超时)?

还有HttpSession和EJB session如何对应、常用的编程模式是怎样的,不是很明白,可能关键还在于上面的问题没理清。

wlkid
2003-09-23 14:19
是不是大家都觉得太简单了呢?

wlkid
2003-09-23 19:32
还是认为这个问题不重要,又或者是压根就没考虑过,说不出个所以然来?

totodo
2003-09-24 01:36
这些都是ejb的基础啊(大牛们怎么会讨论这个呢,自降身份!),趁我也在学习就小聊一把吧

Session Bean顾名思意 就是会话bean。 既然是会话那它一定有一种状态(State)。所以它有 Stateful Session Bean,Stateless Session Bean)

对于Enterprise Bean的调用,是通过生成EJBObject来实现的。客户端是不直接访问的。 所以要通过服务器端建立一个Remote接口与client联系,实例子化EJBObject.当然是要调用Home接口的。

对于session的理解可以是和HttpSession一样的。

只是客户端,先通过jndi获取到对Home对象,并创建

就是那段Object ref = ctx.lookup("xxxx");

然后 ejbCreate();

调用自己的方法,

调用enterprise bean 。

然后ejbRemove()

这些好多入门级的代码都这样写。

一个sessionbean创建了,一般都是调用他的。。这个好象没有默认的消失时间。就算有可能和jvm的GC有关,我对这个不太清楚

session bean 常用的模式是session Facade模式。

totodo
2003-09-24 02:44
后来无意中找到一片关于 ejb lifeclye的文章。。读了感觉对我们这些初学者比较不错

http://www.think.idv.tw/THINK/j2ee/EJBLifeCycle.scr

可能需要注册

wlkid
2003-09-24 09:44
谢谢totodo,总算有个响应的了,呵呵

俺虽然算不上个牛人,但算半个的话至少还是问心无愧的,先前提出的问题只是个引子,后面其实还有很多相关的问题的,既然这样,偶也就没兴趣再贴了

b4

charlie
2003-09-24 11:25
真正实例对象的生命周期由服务器控制,服务器控制对象池,而不是调用remove()方法 就会真正回收该对象。

stateless bean :

因为无状态,服务器根据应用需要NEW BEAN 和删除 BEAN.

stateful bean:

服务器根据IDLE 时间将bean passactive ,这时,这个bean就可以被重新设置值服务其他session,也就是说在一个会话过程中 ,真正服务的stateful bean 可以不是同一个。

totodo
2003-09-24 11:45
wlkid

恩,见过好多牛牛都是从最简单问题展开讨论的。。

希望你继续贴啊。

hpnights
2003-09-24 12:25
EJB如何介定一个stateful session bean是属于一个客户端(调用ejb的客户端)其实是靠客户端保持对ejb的引用的。也就是说,假如你的web端想保持一个信息在ejb端的stateful session bean中,然后就应该一直保持这个远程对象的引用,如把引用存在web session中:

session.setAttribute("ejbRef",ejbObjRef);

一旦释放:

session.setAttribute("ejbRef",null);

则ejb容器按照规定的步骤在一段时间后把该stateful session bean自动退化收集了。

当然,如果你保持了引用,但是很长时间没有调用该stateful session bean,ejb容器也会按照策略进行序列化到硬盘的操作,等下次你调用后再行读出,但是不会收集。

banq
2003-09-25 09:18
hpnights 分析有道理,所以一般需要编制一个HttpSessionBindListener,专门监听HttpSession,一旦失效,启动unbound(大概是)方法,实现sfsb的remove动作。

SFSB为什么有人认为难用,不喜欢,就是因为要做清除,否则会严重影响性能。不象SLSB,用完就不管了,其实SLSB用完也应该注意释放一些资源,这是EJB使用中最应该注意的,也是陷阱之一吧!

robbin
2003-09-25 11:00
我觉得有两个原因是我不愿意用SFSB

1、状态管理

SFSB带状态,我必须小心进行状态管理

2、性能问题

SFSB是调用的时候才创建,不像SLSB能够预创建之后缓存在池中,速度很慢。

oldma
2003-09-25 13:17
的确有很多SLSB用完就不用管了

比如weblogic server 6+

在weblogic的实现中,remove方法里是空的,它什么也不作。

weblogic的SLSB的调用是方法级的,就是你连续调用一个

SLSB的两个方法,可能用到服务器端不同的SLSB的实例(所以最好不要在SLSB方法中使用实例变量)

我觉得随着App Server、J2EE框架的发展和成熟,这些严重影响性能的问题,应用服务器会开发商自己会慢慢解决

hpnights
2003-09-25 17:05
remove()方法为空并不代表app server什么都不做啊。

那只是远端EJBObject接口的一个方法申明,weblogic必定有自己的一套实施方法来继承并实现的。

slsb的定义本身就是和状态无关的,也就是说服务器会按policy自动调用pool中的某个bean为客户端服务的,客户端是透明的,无法知道此情况。

虽然ejb端的处理是重量级的操作,但是在应用服务器开发商无法更新其内部实现的情况下,通过调整参数等性能调优还是能优化整体性能的。

oldma
2003-09-26 10:20
可能我没有表达清楚,我说的remove方法就是指weblogic.jar中的那个

impl类的remove方法。

zxlrc28
2003-10-14 15:16
session bean与session之间没有任何联系。

猜你喜欢