# 闭幕

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ldap/close.html](https://docs.oracle.com/javase/tutorial/jndi/ldap/close.html)

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

## 明确的闭包

你在 `Context` 实例上调用 [`Context.close（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/Context.html#close--) 来表示你不再需要使用它。如果正在关闭的 `Context` 实例使用专用连接，则连接也将关闭。如果 `Context` 实例与其他 `Context` 和未终止 `NamingEnumeration` 实例共享连接，则直到 `close（）`才会关闭连接已在所有此类`上下文`和 `NamingEnumeration` 实例上调用。

在[连接创建](create.html#SHARE)示例部分的 [`example`](examples/Shared.java) 中，必须先关闭所有三个 `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();

```

## 强制隐式闭包

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

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

```

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

## 检测连接闭包

LDAP 服务器通常具有空闲超时时间，之后它们将关闭不再使用的连接。当您随后在使用此类连接的 `Context` 实例上调用方法时，该方法将抛出 [`CommunicationException`](https://docs.oracle.com/javase/8/docs/api/javax/naming/CommunicationException.html)。要检测服务器何时关闭 `Context` 实例正在使用的连接，请使用 `Context` 实例注册 [`UnsolicitedNotificationListener`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ldap/UnsolicitedNotificationListener.html)。 [`AN example`](examples/RegUnsol.java) 显示在 LDAP 未经请求的通知部分中。虽然该示例旨在从服务器接收未经请求的通知，但它也可用于检测服务器的连接关闭。启动程序后，停止 LDAP 服务器并观察调用侦听器的 [`namingExceptionThrown（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/event/NamingListener.html#namingExceptionThrown-javax.naming.event.NamingExceptionEvent-) 方法。