请教各位大侠,如果查找一个已创建的有状态session bean?

场景如下:使用struts做mvc框架,其中在action中调用有状态sessionbean,由于action本身线程不安全,所以将对bean的引用定义为excute()中临时变量.这样当多次调用action时,原创建的对bean的应用就没法保存.
请问有没有什么办法能通过create()中参数,重新定位已创建的bean

放在HttpSession中, 有态session bean必须自己hold处理的。

谢谢benq大哥的回复.
那小弟再加问一句,基本上所有的讲状态session bean的参考书,都会提到其最适合做购物车的情景,既然也要存在httpsession中,那似乎不如直接在httpsession中存储来的方便,不知我的理解是不是正确.

你的疑问是很多人的问题,这里涉及互相调用和划层的问题,你放在HttpSession中,也就是Web层,其他无态Session Bean是无法回调Web层的东东的,只有Web层访问EJB层。

另外 有态Session bean的容器提供了状态集群的机制,这方面实现比HttpSession的failover实现得要好,参考J2EE集群原理一文:
http://www.jdon.com/jive/article.jsp?forum=121&thread=22282

所以你如果有状态,尽量使用有态Session bean,而不是HttpSession,尽量不要使用HttpSession,因为HttpSession的failover是非常耗费性能的。


关于应用事务(application transactions)有很多讨论,Hibernate发明者Gavin King也曾经对长事务缺乏过认识,特别他认为EJB丑陋,但是他写了一篇文章Stateful Session Beans Rock

http://www.theserverside.com/news/thread.tss?thread_id=25322

他认为有态Bean毫无性能问题(以前认为EJB有性能问题是一种缪误,包括在本站讨论的一些人的观点)

多谢banq大哥,推荐文章拜读中....

"JBoss Weblogic Websphere等对有态Session bean机制都比Web层的HttpSession failover要好。" ----

这样说有什么具体根据吗? HTTPSESSION 和 SFSB 的状态复制用的是同一个机制 (见http://e-docs.bea.com/wls/docs81/cluster/failover.html#1008850). 除非 JBOSS, BEA 和 IBM 程序写错了, 否则这两者在状态复制方面的性能不会有差别.

另外, 对于 WEB + EJB 系统而言, EJB层面的集群功能(主要指状态复制)是用不到的. 比如WEBLOGIC, 如果EJB是被JSP, SERVLET引用, 那么EJB的LOAD BALANCE是被禁止的, 这是WEBLOGIC内部的基本优化之一. EJB的LOAD BALANCE只有在被外部客户直接引用才有效果.

并且对于 WEB + EJB 系统而言, EJB的FAIL OVER本身也没有实际意义. 原因很简单: WEB容器和EJB容器在一个JVM里, 如果EJB容器死了, WEB容器必定也死掉了. EJB的FAIL OVER, 只有在客户继续存在的情况下才能发生. 作为客户的WEB已经死了, FAIL-OVER一个EJB呼叫是没有意义的. 从 EJB 集群的具体实现也可以看出这一点: WEBLOGIC里, EJB 的 LOAD BALANCE是通过 STUB 来实现的. 当STUB已经随WEB CLIENT 消失了, EJB LOAD BALANCE有从何谈起? 这也是 WEB 引用 EJB 时 EJB LOAD BALANCE 被禁止的原因所在.

单就性能而言, 使用SFSB并不会比使用HTTPSESSION更好. 这不仅仅是一个理论推断, 也有实际数据支持: (见http://dev2dev.bea.com/pub/a/2002/10/zadrozny.html). 这篇BEA DEV2DEV的实验文章表明, 二者的性能是大体相当的.

采用SFSB的效益, 主要在于:
1. EJB容器对交易/事物处理的支持.
2. 更符合OO设计, 可以节省某些"CONTEXT OBJECT"这样的WEB层设计模式, 和由此而来的每个WEB请求重构CONTEXT OBJECT的性能代价.
3. 支持WEB以外的外部客户.

采用SFSB的代价, 在于:
1. 必须使用EJB容器.
2. 实现时必须保证SFSB在SESSION结束或者超时后被EJBREMOVE().

在集群支持方面, 尤其在WEB系统场合下, 二者并没有性能区别.

最简单的方法: 不要搞任何httpsession或者SessionBean, Session信息全部放在客户Cookie里(客户Cookie只存索引, session信息放在数据库中), 前台一个LoadBalance分发到任何一台HttpServer都能处理, httpServer只调本地的EJB或者不用EJB, 数据库的访问会略有增加, 因为每次请求都要取数据库中的Session信息