【问题标题】:EJB stateful vs stateless session beans when using a DB使用 DB 时的 EJB 有状态与无状态会话 bean
【发布时间】:2017-08-29 16:49:26
【问题描述】:
对于有状态会话 bean (SFSB) 与无状态会话 bean (SLSB) 的使用,我有点困惑。
我了解 SFSB 与客户保持状态。这有帮助:When to use Stateful session bean over Stateless session bean?
这里和许多其他地方提供的示例是 SFSB 的购物车。
我的问题是如果应用程序由数据库支持,为什么还需要 SFSB?
购物车通常会在每次发生更改时更新数据库吗?或者状态是否驻留在 SFSB 中,直到不需要(然后转储到数据库),就像某种缓存一样??
“如果一个任务需要一系列方法调用(不止一个),并且您需要保留以前的结果以便在下次调用中使用它们,那么可以使用 SFSB” - source。这更像是结帐(页面之间的表单??),在最后一页之前,数据库中不会保存任何内容。
但是对于购物车,我会想象每当用户向他们的购物车添加东西时写入数据库?
或者我错过了 SFSB 的重点:)
【问题讨论】:
标签:
java
ejb
stateless-session-bean
stateful-session-bean
【解决方案1】:
过去,我花了很多时间试图找到除了(明显的)购物车之外的其他示例,但没有成功。
在我看来,Stateful bean 仅属于 JSE 领域,其中客户端没有 HTTPSession 之类的东西。因此,向服务器维护其状态的唯一方法是保留对 Stateful Proxy 对象的引用。在许多 Oracle/Sun 文档中,Stateful 被称为客户端到服务器的扩展(或相反)。
在过去,我实际上编写了一些由 Stateful bean 支持的小型 JSE Main 类,用于快速管理目的:关闭/修改帐户、监控等...
剩下的问题:
当我们谈论 JEE 领域(主要是 Web 应用程序)时,您实际上有几个选项来保持客户端状态:HTTPSession 将所有篮子放在内存中,或者对篮子的引用和对其 ID 的引用可能在会话和轮次中从会话到用于存储对象的数据库。选择 on 或其他方法各有利弊。
有时我发现有状态 bean 保存在 http 会话中的示例。我发现这种方法很奇怪。老实说,我还没有发现有状态存储在生产版本的会话中。
【解决方案2】:
当数据不确定是否持久时,您使用 SFSB-s。用户只是将一些东西放入购物车,但从不购买。在这种情况下,将这些数据存储在数据库中并不是一个好主意。将真正需要的数据存储在数据库中,而不是垃圾。与在预定义时间段内未购买/处理的事物相关的数据是临时的,您应该以临时(会话范围/到期日期受限)的方式存储它们。
当用户结帐她/他购物车的内容时,数据具有商业意义,应该在数据库中进行。