假设我在我的应用程序中部署了一个有状态会话bean。在我的客户端应用程序中,我尝试在JNDI的帮助下使用此会话bean。在我获得bean的存根(不是实际的bean本身)并初始化该bean的某些字段之后,我尝试使用JNDI第二次获取此bean。
那么我将从app服务器获得什么bean?它会是同一个bean两次还是我将使用bean的第二个实例?如果我将两次获得相同的bean,我怎样才能从app服务器获得同一个bean的两个不同实例?我只是对豆子本身的看法感到困惑。如果可能提供一些资源。
答案 0 :(得分:2)
假设您通过JNDI获取对远程bean实例的引用。现在,假设您在远程bean methodA
和methodB
上调用两个业务方法。
有状态bean和无状态bean之间的(主要)区别是:
methodA
和methodB
不会保证在服务器端的完全相同的bean实例上运行。methodA
和methodB
保证在服务器端的完全相同的bean实例上运行。从客户端,请注意您所拥有的只是对服务器端的一个模糊对象的引用。在该“存根”上调用多个方法 - 即使它是相同的存根对象 - 并不能保证您将在服务器端处理完全相同的对象,除非您的bean是有状态的。
现在,更具体地说,问题。你说你在服务器上部署了一个有状态bean,你通过JNDI获得了对bean实例的引用。为此,您必须在EJB的home接口上使用create
方法。 create
方法向您返回了一个存根,该存根映射到服务器端的实例。
下次在主界面上调用create
时,您将获得一个不同的存根,指向服务器端的不同的 bean。
如果你想维护对前一个bean的访问,那么你需要以某种方式保持对该远程对象的引用。
答案 1 :(得分:1)
有状态会话bean是企业bean(EJB组件) 充当使用它的客户端的服务器端扩展。该 有状态会话bean由客户端创建,仅适用于 该客户端直到客户端连接被删除或bean为止 明确删除。
这意味着,对于同一客户端而言,无论您多次从服务器获取,都必须返回相同的实例。否则,你不能依赖国家。
另请参阅Oracle documentation。