【问题标题】:Stateless and Stateful confusing definitions and outputs (contradicting to my view)无状态和有状态的混淆定义和输出(与我的观点相矛盾)
【发布时间】:2015-06-06 07:57:34
【问题描述】:

据我理解,@Stateless 表示每次遇到客户端到服务器的状态都是从零开始,而@Stateful 表示服务器将客户端的数据保存在自己的内存中。
("无状态意味着没有过去的记忆。每笔交易都像第一次完成一样执行。
statefull 意味着有过去的记忆。以前的交易会被记住,并且可能会影响当前的交易。
")。

我一直在阅读http://www.tutorialspoint.com/ejb/ejb_stateless_beans.htmhttp://www.tutorialspoint.com/ejb/ejb_stateful_beans.htm
那里的示例表明,在 @Stateless 注释中,当客户端退出并重新进入时,似乎服务器 确实 保存了数据并呈现了从“先前”客户端添加的书籍,但在 @Stateful 注释中,似乎服务器将返回的客户端视为新客户端,并且没有保存客户端创建的列表。

我认为我的误解与对“状态”、“内存”或“事务”这些术语的误解有关,但目前我很困惑,因为定义似乎与输出相矛盾。

【问题讨论】:

    标签: java ejb stateless stateful


    【解决方案1】:

    您非常了解有状态和无状态会话 bean 之间的区别。您只是碰巧阅读了一个令人困惑的示例。

    无状态

    无状态会话 bean 由生成实例池的 EJB 容器管理。您可以在其中包含实例变量,但您不能依赖它,因为服务器不保证您将在方法调用之间访问相同的实例。

    在无状态示例中,将书籍添加到 bookShelf 列表不是一个好主意,因为第二次查找可能会从实例池返回不同的 bean,并且可能找不到在第一步中添加的书籍。

    在文章底部有解释:

    上面显示的输出可能会根据 JBoss 维护的无状态 ejb 对象的数量而有所不同。

    如果维护单个无状态 ejb 对象,您可能会在每次查找后看到相同的书籍列表。

    EJB 容器可能会为每次查找返回相同的无状态 ejb 对象。

    无状态 ejb bean 保持实例变量的值,直到服务器未重新启动。

    作者了解无状态会话 bean 的工作原理,但用例与太多“可能”混淆。不建议将实例变量存储在无状态会话 bean 中,因为您无法保证将在池中获得哪个实例。

    有状态

    另一方面,有状态会话 bean 将在查找后绑定到客户端。只要客户端保留对它在查找后获得的实例的引用,它就会继续在 EJB 容器中访问相同的实例。最后一部分很重要,因为如果客户端进行另一次查找,它将获得另一个有状态会话 bean 的实例。

    在第二个例子中,在添加一本书并显示我们有多少本书后,有 1 是正常的。第二次查找会给你另一个实例,因此 bookShelf 是空的。

    有状态会话 bean 对于在服务器端存储状态很有用,只是要小心在客户端保持实例引用。

    【讨论】:

    • 好的,让我们通过忽略随机无状态注释来简化这一点,并专注于有状态,因为据我了解,输出应该是稳定的。 (如果我错了,请纠正我)。为什么当客户重新进入并进行查找时,他得到一个空架子?那是我不明白的,如果服务器保存了他的状态,这不应该意味着查找应该返回客户端创建的数据库吗?如果您能解释“保持对实例的引用”的含义。谢谢
    • 当您进行查找时,服务器没有机制知道客户端是否相同。客户端必须保持与第一次查找本身获得的相同引用。一个典型的用例是购物网站上的购物车。对有状态会话 bean 的引用应保留在用户会话中,以便在购物车的更改之间重用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2011-10-28
    相关资源
    最近更新 更多