Java-Jndi ldap慢速搜索

时间:2018-11-15 15:58:16

标签: java performance ldap jndi openldap

我们正在使用javax.naming.ldap.LdapContext连接和查询openLdap。

问题在于,我们将com.sun.jndi.ldap.LdapSearchEnumeration作为结果,并且使其循环非常慢,例如每秒5个SearchResult。

我也尝试了apache ldap api和im获得相同的时间,除非我带来较少的属性,但仍然很慢。要获得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秒钟,使用im进行搜索的用户会出问题吗?显然不是rootDN吗?

1 个答案:

答案 0 :(得分:1)

Apache具有正在使用的LDAP API。您可以检出here。不幸的是,此时文档还不够充实。 User Guide上有很多页面是空的,但是您可以凭直觉和JavaDocs的一些帮助来填补空白。

即使缺少良好的教程,我也曾经使用过此API,并很幸运。我建议至少尝试一下,看看情况是否有所改善。