NamingEnumeration hasMoreElements方法在为LDAP返回false时需要花费大量时间

时间:2009-07-19 16:07:21

标签: ldap

我正在尝试搜索LDAP服务器(Active Directory)。当我解析搜索结果时,hasMoreElements NamingEnumeration方法在返回false时大约需要15-20秒才能执行。当它返回true时不是这种情况。有没有办法解决这个问题?

代码:

SearchControls ctrl = new SearchControls();
ctrl.setSearchScope(SearchControls.SUBTREE_SCOPE);
String searchFilter = "(&(objectClass=user("uid"="abc"))";
NamingEnumeration ne = dirContext.search("ldap://abc:389/dc=abc,dc=xy", searchFilter,ctrl);

if (ne != null) {
    while (ne.hasMoreElements()) {
        //parse results
    }

2 个答案:

答案 0 :(得分:6)

NamingEnumeration最后一次调用hasMoreElements()时会进行一些清理。它还检查是否有其他引用是context-property Context.REFERRAL设置为“follow”。在我们软件的一个案例中,这导致了所描述的行为:最后一次调用hasMoreElements()(或hasMore()或调用next()比允许更频繁)导致最多40秒作为推荐在LDAP上下文中搜索。解决方案是不将Context.REFERRAL设置为“关注”。

答案 1 :(得分:0)

AD具有在LDAP查询中返回的对象数量的默认限制。我认为它在1000对象范围内。

如果你点击1001,你会得到1000,然后是错误,所以我可以看到这种情况。

计算您在测试中获得的对象数量,然后打败1000,然后失败。