Closing

普通垃圾收集会负责删除不再使用的Context个实例。 Context个实例被垃圾回收使用的连接将自动关闭。因此,您不需要显式关闭连接。但是,网络连接是有限的资源,对于某些程序,您可能希望控制它们的扩散和使用。本节包含有关如何关闭连接以及如何在服务器关闭连接时得到通知的信息。

Explicit Closures

您在Context实例上调用Context.close()来表明您不再需要使用它。如果正在关闭的Context实例正在使用专用连接,则该连接也将关闭。如果Context实例与其他Context和未终止的NamingEnumeration实例共享连接,则在所有此类ContextNamingEnumeration实例上调用close\(\)之前,连接不会关闭。

Connection Creation示例部分的example中,必须关闭所有三个Context实例,然后关闭基础连接。

// Create initial context
DirContext ctx = new InitialDirContext(env);

// Get a copy of the same context
Context ctx2 = (Context)ctx.lookup("");

// Get a child context
Context ctx3 = (Context) ctx.lookup("ou=NewHires");

// do something useful with ctx, ctx2, ctx3

// Close the contexts when we're done
ctx.close();
ctx2.close();
ctx3.close();

强制隐式关闭

如前所述,对于那些不在范围内的ContextNamingEnumeration实例,Java 运行时系统final将对其进行垃圾回收,从而清除close\(\)会完成的状态。要强制垃圾回收,可以使用以下代码。

Runtime.getRuntime().gc();
Runtime.getRuntime().runFinalization();

根据程序的状态,执行此过程可能会导致严重的(临时的)性能下降。如果需要确保关闭连接,请跟踪Context实例并明确关闭它们。

检测连接断开

LDAP 服务器通常有一个空闲超时时间,在此之后它们将关闭不再使用的连接。当您随后在使用此类连接的Context实例上调用方法时,该方法将抛出CommunicationException。若要检测服务器何时关闭Context实例正在使用的连接,请在Context实例中注册UnsolicitedNotificationListenerAN example显示在“ LDAP 未经请求的通知”部分中。尽管该示例旨在用于接收来自服务器的未经请求的通知,但它也可以用于检测服务器的连接关闭。启动程序后,停止 LDAP 服务器并观察调用了侦听器的namingExceptionThrown()方法。