我正在读一本关于Java 6的书,我看到了以下几部分:
“无状态:会话bean不包含方法之间的会话状态,任何实例都可以用于任何客户端。”
“状态:会话bean包含会话状态,必须为单个用户跨方法保留会话状态。”
“会话状态”是什么意思?有没有现实世界的例子来解释呢?
提前谢谢。
II.为什么这种豆类分类如此重要?对于初学者(一见钟情)都没有正确的解释,所以多亏了你,我得到了逻辑上的区别,但为什么这种行为如此重要?
发布于 2011-03-01 10:51:13
在最基本的情况下,“会话状态”是指实例字段的值。
对于无状态会话bean,容器并不保证后续的方法调用将使用相同的EJB实例(来自池),因此您不能假设在调用bean方法时放置的值在再次调用该方法(或bean的另一种方法)时仍然存在。
对于有状态会话bean,容器保证后续调用将使用相同的EJB实例,因此可以保留实例字段值。
为了举个例子,假设您有一个bean,它有一个增量()和一个检索()方法。增量将增加存储值,并检索当前存储值。
对于无状态会话bean,如果您5次调用增量()方法,就不能保证当您执行检索()时,您将得到一个5,这取决于它将分配给您调用的容器。因此,如果为您分配了一个新的EJB实例,那么您将得到一个零。容器也可能没有清理您的EJB实例,因此可能会得到一个5 --但它不能保证。
对于有状态会话bean,如果您5次调用增量方法,当您检索值时,将得到一个5。容器保证第一次调用时使用的EJB将用于所有后续调用。
发布于 2011-03-01 11:08:28
一个真实的对话状态的例子就是购物车。用户可以一个一个地向购物车中添加几个项目,然后调用结帐。所有增加的时间都会在那里
假设购物车是有状态的,即它将保持会话状态。
cart.add(item1); // suppose cart keep tracks of item by adding it to ArrayList
cart.add(item2);
cart.checkOut(); // at this stage both item1 and item2 would be there in ArrayList.如果购物车是无状态的,那么每个调用都将独立于以前的调用,并且在结帐时它什么也不能拥有。
对于第二点,区分是必要的,因为两个bean的行为不同。因此,维护状态需要资源,因此有状态bean不像无状态bean那样可伸缩。
发布于 2013-08-04 21:43:43
关于问题的第二部分,您可以从java 6教程中阅读以下内容:
时toUse会话Beans 如果下列任何条件为真,则有状态会话bean是适当的。
为了提高性能,您可以选择一个无状态会话bean,如果它有这些特性的话。
Java 6教程
https://stackoverflow.com/questions/5153012
复制相似问题