2

当我们创建一个新InitialContext的用于远程访问 Enterprise Java Beans 时,工作完成后,我们应该总是关闭contextviacontext.close()吗?

这是一个代码示例:

// Client side method
private void doSomeActionMethod() {
    RouteTransactionFacadeBeanRemote remote = null;
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    Context context = null;
    try {
        context = new InitialContext(jndiProperties);
        remote = (RouteTransactionFacadeBeanRemote) context
                 .lookup("ejb:EJBEAR/EJBServer//RouteTransactionFacadeBean!facade.RouteTransactionFacadeBeanRemote");

        //DO SOMETHING WITH REMOTE EJB

        } catch (NamingException e) {
            e.printStackTrace();
        } finally {
            try {
                // Should we always do this?
                if (context != null) context.close();
            } catch (NamingException ex) {
                ex.printStackTrace();
            }
        }
    }
4

1 回答 1

3

来自 javadocs:

关闭此上下文。此方法立即释放此上下文的资源,而不是等待垃圾收集器自动释放它们。此方法是幂等的:在已经关闭的上下文中调用它没有任何效果。不允许在封闭上下文中调用任何其他方法,这会导致未定义的行为。

虽然,垃圾收集器会收集它们,但不是等待gc,你应该close通过提供的函数来收集它们。所以,我的回答是,是的,你应该关闭它以及应该关闭的任何其他资源。

于 2016-05-16T18:10:01.763 回答