java - 什么是最简单(即最不复杂)的 LDAP 操作

标签 java ldap jndi connection-pooling

我已经使用 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/

相关文章:

java - Unboundid 不返回请求的 LDAP 属性。为什么?

java - 使用Apache DS/Apache Directory Studio的Hadoop安全性

spring - Grails Spring Security REST + LDAP

tomcat - Spring MVC 无法获取在 JNDI 中配置的数据源

java - Tomcat 如何注入(inject) JNDI 组件本地上下文?

java - 范围报告 : Not able to see the screenshots on other machine

java - 使用 Hibernate 的对象关系映射 - "Sessionbound"是什么意思?

session - 访问远程/本地 session Bean

java - hibernate 中没有外键的一对多

java - 我可以在迭代时从列表中删除吗?