0

我们使用 javax.naming.ldap.LdapContext 来连接和查询一个 openLdap。

问题是我们得到 com.sun.jndi.ldap.LdapSearchEnumeration 作为结果,并且循环它真的很慢,比如每秒 5 个 SearchResult。

我还尝试了 apache ldap api,并且我得到了相同的时间,除非我带来的属性更少但它仍然很慢。要获得 180 个结果,需要 10 秒。

jndi ldap的代码示例:

       Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://aplivolatil....:389");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "uid=usuarioLector.....");
    env.put(Context.SECURITY_CREDENTIALS, "9IVNOaQmEeE");
    env.put(Context.BATCHSIZE, "1000");
    env.put(Context.REFERRAL, "ignore");
    LdapContext contexto;

    try {
        //contexto = new InitialLdapContext(env, null);
        contexto = new InitialLdapContext(env, null);

        SearchControls controlesBusqueda = new SearchControls();
        String [] attrs = new String [] {"cn"};
        controlesBusqueda.setReturningAttributes(attrs);
        controlesBusqueda.setSearchScope(1);

NamingEnumeration<SearchResult> resultadosObjetos = contexto.search("cn=usuarios-......",
                "(&(objectClass=inetOrgPerson))", controlesBusqueda);


        while (resultadosObjetos.hasMore()) {
            resultadosObjetos.next();
        }

因此,经过调查和多次测试,我们发现将 jndi ldap 环境属性“batchsize”设置为 1000,相同的延迟转到搜索方法而不是循环结果时。这在某种程度上说 api 可能会在每个 next() 上进行 ldap 是有道理的。但是为什么要延迟这么多呢?

随着 rootDN 的速度超快,1 秒,我用于搜索的用户可能有问题吗?这显然不是 rootDN ?

4

1 回答 1

1

Apache 有一个他们正在开发的 LDAP API。你可以在这里查看。不幸的是,此时文档还不是很充实。用户指南中有很多页面是空白的,但是您可以通过一些直觉和JavaDocs的帮助来填补空白。

即使缺少好的教程,我之前也使用过这个 API,并且很幸运。我建议至少尝试一下,看看情况是否有所改善。

于 2018-11-15T16:39:34.083 回答