文档

Java™ 教程
隐藏目录
关闭
路径:Java命名和目录接口
课程:LDAP用户的高级主题
章节:连接管理

结束

普通的垃圾回收会在不再使用Context实例时进行清除。被垃圾回收的Context实例使用的连接将自动关闭。因此,您不需要显式关闭连接。然而,网络连接是有限资源,对于某些程序,您可能希望对其产生和使用进行控制。本节包含有关如何关闭连接以及如何在服务器关闭连接时收到通知的信息。

显式关闭

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

example中,来自连接创建示例部分的所有三个Context实例在底层连接关闭之前必须关闭。

// 创建初始上下文
DirContext ctx = new InitialDirContext(env);

// 获取相同上下文的副本
Context ctx2 = (Context)ctx.lookup("");

// 获取子上下文
Context ctx3 = (Context) ctx.lookup("ou=NewHires");

// 使用 ctx、ctx2、ctx3 进行一些有用的操作

// 完成后关闭上下文
ctx.close();
ctx2.close();
ctx3.close();

强制隐式关闭

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

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

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

检测连接关闭

LDAP服务器通常在一段空闲时间后关闭不再使用的连接。当您随后调用使用此连接的Context实例的方法时,该方法将抛出CommunicationException异常。为了检测服务器关闭Context实例使用的连接,您需要在Context实例中注册一个UnsolicitedNotificationListener。在LDAP未请求通知部分中显示了一个示例。尽管该示例设计用于从服务器接收未请求的通知,但也可以用于检测服务器关闭连接。启动程序后,停止LDAP服务器并观察到监听器的namingExceptionThrown()方法被调用。


上一页: 创建
下一页: 池化