我已经使用 Apache commons-pool 为 LDAP 连接实现了一个池。我无法使用 JNDI (http://download.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html) 提供的池功能,因为我使用 SSL 连接(使用自定义(Oracle 提供的)套接字工厂(java.naming.ldap.factory.socket
env value set)取消 JNDI 池的上下文)到 LDAP 服务器,因此自动禁用 JNDI 内的池设施,即使相应的池属性是设置。
现在到了将池化的InitialDirContext
实例返回到池中的地步,需要检查它是否仍然可用并且没有被用户关闭或丢失由于其他原因连接到 LDAP 服务器。
这是我目前查找已知存在的特定用户的 DN 的地方:
final InitialDirContext ctx = internalPooledLDAPConnection.getCtx();
final Subscriber sub = internalPooledLDAPConnection.getSub();
SearchControls ctls = new SearchControls();
ctls.setSearchScope(2);
ctls.setReturningAttributes(new String[] { "dn"});
NamingEnumeration resultSet = ctx.search(sub.getUserSearchBase()[0], "(&(objectclass=*)(uid=orcladmin))", ctls);
如果这个操作没有抛出任何异常,那么我内部池化 Ldap 连接中的 InitialDirContext
仍然可用,并且可以安全地从池中取出以供重新使用。
但是我想知道这是否是可以在此处执行的“最便宜”的连接健全性检查,或者是否存在我可以使用的更便宜的 LDAP 操作。
最佳答案
LDAP 比较操作可能比搜索更有效,因为只有一个响应(对于与条目匹配的搜索,您将有两个响应——一个用于条目,第二个用于指示搜索结果的末尾)。
但是,您可能还想考虑 JNDI 的替代方案,因为它为 LDAP 提供了一个臭名昭著的糟糕 API。还有其他用于执行 LDAP 通信的 Java 库,它们比 JNDI 好得多。特别是,用于 Java 的 UnboundID LDAP SDK(我是其开发人员)为 LDAP 通信提供了功能丰富、易于使用、高性能的 API。它具有丰富的连接池功能,包括健康检查、故障转移和负载平衡。参见 https://docs.ldap.com/ldap-sdk/docs/advantages/comparison.html用于比较 UnboundID LDAP SDK 与 JNDI 和 Netscape Directory SDK for Java 提供的功能。
关于java - 什么是最简单(即最不复杂)的 LDAP 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5892992/