Java 会话bean是如何工作的?

Java 会话bean是如何工作的?,java,jakarta-ee,ejb,rmi,jndi,Java,Jakarta Ee,Ejb,Rmi,Jndi,假设在我的应用程序中部署了一个有状态会话bean。在我的客户机应用程序中,我尝试在JNDI的帮助下使用这个会话bean。在获得bean的存根(不是实际的bean本身)并初始化该bean的一些字段之后,我尝试使用JNDI第二次获取该bean 那么,我将从AppServer获得什么bean呢?它将是同一个bean两次还是我将使用该bean的第二个实例?如果我将获得相同的bean两次,如何从AppServer获得相同bean的两个不同实例?我只是不知道豆子本身是什么。如果可能,提供一些资源 有状态会话

假设在我的应用程序中部署了一个有状态会话bean。在我的客户机应用程序中,我尝试在JNDI的帮助下使用这个会话bean。在获得bean的存根(不是实际的bean本身)并初始化该bean的一些字段之后,我尝试使用JNDI第二次获取该bean

那么,我将从AppServer获得什么bean呢?它将是同一个bean两次还是我将使用该bean的第二个实例?如果我将获得相同的bean两次,如何从AppServer获得相同bean的两个不同实例?我只是不知道豆子本身是什么。如果可能,提供一些资源

有状态会话bean是一个企业bean(EJB组件),它 充当使用它的客户端的服务器端扩展。这个 有状态会话bean是由客户机创建的,并且只适用于 直到客户机连接断开或bean被删除 明确删除

这意味着,对于同一个客户机,无论您要从服务器获取多少次,都必须返回相同的实例。否则,你不能依赖国家


另请参阅。

假设您通过JNDI获得对远程bean实例的引用。现在,假设您在远程bean上调用了两个业务方法,
methodA
methodB

有状态bean和无状态bean之间的(主要)区别是:

  • 如果您的bean是无状态的,那么
    methodA
    methodB
    不能保证在服务器端的同一bean实例上运行
  • 如果bean是有状态的,那么
    methodA
    methodB
    保证在服务器端的同一bean实例上运行
在客户端,请注意,您所拥有的只是对服务器端一个模糊对象的引用。调用该“存根”上的多个方法(即使是同一个存根对象)并不能保证在服务器端处理完全相同的对象,除非您的bean是有状态的

现在,更具体地说,谈谈你的问题。您说您在服务器上部署了一个有状态bean,并且通过JNDI获得了对bean实例的引用。为此,您必须在EJB的主接口上使用
create
方法。
create
方法向您返回了一个存根,该存根映射到服务器端的一个实例

下次在主界面上调用
create
,您将得到一个指向服务器端不同bean的不同存根

如果希望保持对前一个bean的访问,那么需要以某种方式保留对该远程对象的引用

  • 如果您使用的是EJB2.x,那么您不应该在任何地方“缓存”存根;相反,获取bean句柄的引用并将句柄存储在某个地方
  • 如果您使用的是EJB3.x,那么您可以简单地存储对存根的引用

IMO这是本教程中更为谨慎的部分(关于bean生命周期):