关于会话EJB的使用,我在“真实世界的应用程序”(如果我记得正确)中看到的是无状态会话EJB,用作事务(通过CMT)业务逻辑方法的“外观”。但是,我没有看到任何有状态会话EJB。事实上,在Java EE书籍中,它们作为“购物车”的使用似乎意味着它们的状态应该以某种方式存储在持久存储中。但这似乎表明,应用程序域的其他部分(如数据库中建模)也应该映射到有状态EJB-s,这似乎过于复杂。
那么,您能否根据您的经验/专业知识,给出有关状态会话EJB如何在今天(而不是2003年)应用程序中使用的具体示例?
答案 0 :(得分:2)
有状态EJB可以将其状态保存在数据库中,但有状态EJB不一定需要将其状态保存在数据库中。有状态EJB必须在内存中存储并记住与客户端的会话状态,仅在“会话”期间。
根据Java EE 7 Tutorial,您可能会在下面找到一些适用于有状态EJB使用情况的实际示例: 如果满足以下任一条件,则有状态会话bean是合适的。
bean的状态表示bean与特定客户端之间的交互。真实世界示例:使用登录,操作,注销进行在线事务的有状态EJB实现。
bean需要跨方法调用保存有关客户端的信息。真实世界示例:有状态EJB可用于实现购物卡。数据可以保留或不保留,例如对于不需要登录的电子商店,如果用户最终没有检出他收集的物品,则可以丢弃购物卡。
bean在客户端和应用程序的其他组件之间进行调解,向客户端呈现简化视图。有状态EJB可用于实现持久性抽象。
在幕后,bean管理多个企业bean的工作流程。真实的例子:有状态EJB可用于实现在线度假预订交易,其中EJB为使用其他EJB从不同提供商预订机票,汽车和酒店的代理建模,然后将结果返回给客户。
以上示例说明了该概念在一些示例中的适用性。实际上,如今在真实环境中使用有状态EJB会产生更纯粹的设计,但如果考虑性能和复杂性,它将不是最佳的。另请参阅Stateful EJBs in web application?。
答案 1 :(得分:1)
我们目前在生产中运行的一个应用程序中有几个有状态EJB。所以我想,它可以被视为一个真实世界的例子。
此EJB用于通过将这些数据分成块并按需发送此块来向客户端提供大量数据。所有这些工作原理如下:
有状态的豆是解决这个问题的必要条件吗?完全没有。
使用无状态bean可以实现所描述的功能。但在这种情况下,我们只有两种方法来实现它。每次客户端需要下一个数据块时,我们都被迫为请求准备结果集(因为我们没有任何状态),或者我们使用一些静态存储并负责我们自己的安全性和并发访问。 /安全在这里我的意思是防止一个客户端使用他的描述符/
访问另一个客户端的结果集的情况与有状态bean的实现相比,第一种方法更慢,效率更低。由于同步,第二种方式在负载下更复杂且更不稳定。
使用有状态bean,我们只需要以有效的方式获得我们需要的东西,而无需额外的努力。