关于JAVA EE状态管理

起初的JAVA EE中状态管理就分四中,请求,页面,会话,应用.
对于一个用户来讲,将他们的状态和跨页面的状态都保存在SESSION中有的时候并不是明智的选择,类似JBOSS SEAM中提出的业务会话上下文,如果从某些角度讲,应该算范围小于SESSION吧,也算是细粒度的控制了状态的管理.
BANQ能否说说SESSION中保存状态和保存在业务会话中有啥区别
利用SESSION存储状态的缺点在哪里,业务会话的优点在哪里?
虽然能体会到好处,但是落在实际上或者是书面,就说不出来,还是感觉自己理解的不够精确,谢谢!

>BANQ能否说说SESSION中保存状态和保存在业务会话中有啥区别利用SESSION存储状态的缺点在哪里,业务会话的优点在哪里?

这个话题实际就是当初对象保存在httpsession还是EJB有态Bean(也就是业务会话)中。

首先,这两者session scope是一致的,有态Bean需要hold在httpsession,这点由Jdon框架或Seam这样框架自动完成了。

当初Spring出来时,将所有业务Bean都搞成两个状态,单例或应用级别多例,没有Session级别多例,所以,我就写了揭露Spring真相那篇文章,被很多人骂,我不知道他们骂什么?

业务会话Session很重要,很多业务功能就需要业务会话来实现,比如购物车属于业务功能吧,需要一个个页面浏览放入商品到购物车,需要session状态保存这些选中的商品,你总不能使用HttpSession来实现吧,那业务功能不是跑到表现层了,违反了分层原则,这是架构大忌啊。

另外业务会话还提供了会话级别的事务,保证会话结束一次性持久,安全稳定。

HttpSession保存对象,没有大小限制,会最后导致内存爆满,而业务会话则有Session管理,有一定容量,超过但是不能清除的,只能钝化到硬盘上,这些机制都保证重要大型业务会话不会丢失。

使用httpsession还有缺点,可能造成session stick,也就是负载平衡多台服务器下,某个请求只能永远粘住一台服务器,请求负载平衡目的达不到。

总之,尽量不用用httpsession,可以使用cookie或ajax来保存状态,业务状态就使用业务会话。


看了回复,明白了一些,但是JAVA EE规范提供的HTTPSESSION状态是针对WEB的无状态连接的情况提供的,目前的业务会话中保存了用户操作的一个业务的需要的状态,但是这个有状态的组件还是要保存到HTTPSESSION中是吧,只不过他的生命周期应用服务器为我们维护了,所以最终还是需要HTTPSESSION,只不过之间加了个有状态的组件,SESSION中不保存状态,而保存的是有状态的组件.不知道我这样的了解是否正确?
或者说业务会话是容器在应用层为我们提供了类似于HTTPSESSION的功能,和HTTPSESSION具有同样的功能,只是各自应用的层面不同?
[该贴被yongbuyanbai于2008-10-27 16:43修改过]

可以这样理解。

>可以这样理解。

不知道BANQ的理解是我第一个说的还是第二个说的,也就是SEAM中的业务会话真正实现了类似于JAVA EE中的SESSION还是说业务会话作为组件还需要保存在HTTPSESSION里面!!!!(问题一)
(问题二)
>有态Bean需要hold在httpsession!

关于EJB的有状态会话BEAN,在组件内部保存了针对某一客户请求的状态,但是这个有状态的BEAN也是保存在HTTPSESSION中才能被客户的后续访问得到(我是这样理解的),如果前面的理解正确,那么突然有个不理解的地方,以前利用SESSION保存的例如用户登陆信息这样的USER和目前采用有状态的会话BEAN有何区别,同样都保存在HTTPSESSION中,虽然有状态BEAN有吨化等操作.
除了SEAM和JDON框架,如果单纯的使用EJB的有态BEAN的时候,还是需要手动的将BEAN放置在SESSION中的,例如购物车组件等,我不理解的问题就是.........
这些组件最终还是要被保存在HTTPSESSION中,那么究竟的区别是什么?(因为我们开发的一个有态BEAN也要放置在HTTPSESSION中,所以就有些迷茫)
请BANQ详细解释下关于应用HTTPSESSION和有状态会话BEAN,有状态会话BEAN究竟相对HTTPSESSION对于应用有哪些好处(个人认为对这个问题的理解可以对状态有更好的理解!),谢谢了!
(问题三)
>需要session状态保存这些选中的商品,你总不能使用HttpSession来实现吧,那业务功能不是跑到表现层了,违反了分层原则,这是架构大忌啊。
这里不把状态保存在HTTPSESSION,而是通过购物车对象进行封装后放入HTTPSESSION中,也说明了将业务功能跑到了表示层吧.这个地方不是很理解.

综合上面三个问题:我感觉我不理解的地方就是,以前我们是将状态保存在HTTPSESSION中,但是现在可以将状态放置在有态BEAN中,但最终还是放入了HTTPSESSION中保存,只是中间将状态用有态对象封装了一下,那么究竟这样做的意义何在?越来越糊涂了!



[该贴被yongbuyanbai于2008-10-30 11:02修改过]

>>关于EJB的有状态会话BEAN,在组件内部保存了针对某一客户请求的状态,但是这个有状态的BEAN也是保存在HTTPSESSION中才能被客户的后续访问得到(我是这样理解的),如果前面的理解正确,那么突然有个不理解的地方,以前利用SESSION保存的例如用户登陆信息这样的USER和目前采用有状态的会话BEAN有何区别,同样都保存在HTTPSESSION中,虽然有状态BEAN有吨化等操作.

首先要搞清楚,EJB是分布式组件模型,是通过RMI机制实现,既然要用RMI,那么势必就要有存根和服务器端骨架呢?所以一般hold到httpsession中的其实是通过JNDI查找到存根。client(可以理解为action)通过JNDI查找到的存根,去调用服务器端的骨架(这个骨架其实就是EJB object ,是容器帮我生成的),然后骨架再去调用EJB组件实例。

所以一般的过程是:Action-->client端的存根(部署时容器自动生成)-->服务器端的骨架(部署时容器自动生成)-->EJB OBJECT(自动生成)-->EJB 组件实例。

所以不同就是利用statefull bean,那么业务状态是存在服务器端,客户端只是缓存了存根。利用httpsession是存到了客户端。

[该贴被xmuzyu于2008-10-30 12:46修改过]