闭幕

原文: https://docs.oracle.com/javase/tutorial/jndi/ldap/close.html

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

明确的闭包

你在Context实例上调用 Context.close() 来表示你不再需要使用它。如果正在关闭的Context实例使用专用连接,则连接也将关闭。如果Context实例与其他Context和未终止NamingEnumeration实例共享连接,则直到close()才会关闭连接已在所有此类上下文NamingEnumeration实例上调用。

连接创建示例部分的 example 中,必须先关闭所有三个Context实例,然后才能关闭基础连接。

  1. // Create initial context
  2. DirContext ctx = new InitialDirContext(env);
  3. // Get a copy of the same context
  4. Context ctx2 = (Context)ctx.lookup("");
  5. // Get a child context
  6. Context ctx3 = (Context) ctx.lookup("ou=NewHires");
  7. // do something useful with ctx, ctx2, ctx3
  8. // Close the contexts when we're done
  9. ctx.close();
  10. ctx2.close();
  11. ctx3.close();

强制隐式闭包

如前所述,对于那些不再在范围内的ContextNamingEnumeration实例,Java 运行时系统最终将垃圾收集它们,从而清理关闭的状态()本来会做的。要强制进行垃圾回收,可以使用以下代码。

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

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

检测连接闭包

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