Java 可以在Servlet';中查找远程EJB会话吗;s init()?

Java 可以在Servlet';中查找远程EJB会话吗;s init()?,java,session,servlets,ejb-3.0,Java,Session,Servlets,Ejb 3.0,我有几个servlet调用远程EJB会话来管理用户的请求。我第一次以这种方式在每个方法中创建了一个新的管理器: ManagerAdminRemote managerAdmin; Context jndiContext = new javax.naming.InitialContext(); Object ref = jndiContext.lookup("ManagerAdmin/remote"); managerAdmin = (ManagerAdminRemote) PortableRemo

我有几个servlet调用远程EJB会话来管理用户的请求。我第一次以这种方式在每个方法中创建了一个新的管理器:

ManagerAdminRemote managerAdmin;
Context jndiContext = new javax.naming.InitialContext();
Object ref = jndiContext.lookup("ManagerAdmin/remote");
managerAdmin = (ManagerAdminRemote) PortableRemoteObject.narrow(ref, ManagerAdminRemote.class);
为了避免这种重复,我实现了
init
方法,如下所示:

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    try {
        Context jndiContext = new javax.naming.InitialContext();
        Object ref = jndiContext.lookup("ManagerAdmin/remote");
        managerAdmin = (ManagerAdminRemote) PortableRemoteObject.narrow(ref, ManagerAdminRemote.class);
    } catch (NamingException e) {
        e.printStackTrace();
    }
}
managerAdmin
声明为类属性。
会话Bean
ManagerAdmin
是无状态的

我正在使用JBoss5,我看到第一次调用Servlet时调用了
init()
。但我也注意到,所有用户共享声明为class属性的相同对象。例如,通过这种方式,不同的用户将共享相同的
managerAdmin

现在我没有遇到任何问题,但我在问:这种分享会带来任何问题吗?耽搁?或者,既然管理者是无状态的,那么这样可以吗


提前感谢。

只要对无状态服务的引用是实例变量,就可以使用这些服务。或者,您可以创建一个
getManagerAdmin()
方法来处理查找,这样您就不必在每个方法中重复查找代码


如果您可以使用JavaEE6和EJB3.1,那么您可能希望让容器将服务注入servlet。请注意,这仅适用于同一类加载上下文中的本地查找(通常是同一应用程序,但如果应用程序未被web/application server隔离,则可能是同一JVM)。

对不起,多个servlet实例?OP的servlet似乎没有实现(已弃用的)
SingleThreadModel
@BalusC我不是servlet专家,但是如果你有多个并发请求,会使用多个servlet实例,不是吗?@Thomas:阅读此文:@BalusC感谢链接,这会让事情更清楚。如果我理解正确,可能有多个实例,或者只有一个实例,这取决于web服务器体系结构。但是,由于您实际上有一个服务代理,将其用作实例变量,因此仍然应该是安全的,因为ejb容器应该处理池,对吗?您必须查找远程ejb。没有注入。至于您的查找代码,请注意,
PortableRemoteObject.slown
是一个EJB2方法,在EJB3中完全没有必要。只需将查找结果直接转换为
ManagerAdminRemote
类型。