假设我的应用程序中部署了一个有状态 session Bean。在我的客户端应用程序中,我尝试在 JNDI 的帮助下使用此 session bean。在获得 bean 的 stub (不是实际的 bean 本身)并初始化该 bean 的某些字段后,我尝试使用 JNDI 再次获取该 bean。
那么我将从应用程序服务器获得什么bean?它会是同一个 bean 两次还是我会使用该 bean 的第二个实例?如果我将获得同一个 bean 两次,如何从应用程序服务器获得同一个 bean 的两个不同实例?我只是很困惑 bean 本身是什么。如果可能的话提供一些资源。
最佳答案
假设您通过 JNDI 获取对远程 bean 实例的引用。现在,假设您在远程 bean 上调用两个业务方法:methodA
和 methodB
。
有状态 bean 和无状态 bean 之间的(主要)区别是:
- 如果您的 Bean 是无状态的,则
methodA
和methodB
不能保证在服务器端完全相同的 Bean 实例上运行. - 如果您的 Bean 是有状态的,则
methodA
和methodB
保证在服务器端完全相同的 Bean 实例上运行。
从客户端来看,请注意,您所拥有的只是对服务器端一个模糊对象的引用。在该“ stub ”上调用多个方法(即使它是同一个 stub 对象)并不能保证您将在服务器端处理完全相同的对象,除非您的 bean 是有状态的。
现在,更具体地说,回答你的问题。您说您在服务器上部署了一个 Stateful bean,并且您通过 JNDI 获得了对 bean 实例的引用。为此,您必须在 EJB 的 home 接口(interface)上使用 create
方法。 create
方法向您返回一个 stub ,该 stub 映射到服务器端的一个实例。
下次您在主界面上调用create
时,您将获得一个不同 stub ,指向服务器端不同 bean .
如果您想保持对前一个 bean 的访问,那么您需要以某种方式保留对该远程对象的引用。
- 如果您使用的是 EJB 2.x,那么您不应该在任何地方“缓存” stub ;相反,获取对 bean 句柄的引用并将句柄存储在某处。
- 如果您使用的是 EJB 3.x,那么您只需存储对 stub 的引用即可。
关于java - session Bean 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23655515/