Java - медленный поиск jndi ldap - PullRequest
0 голосов
/ 15 ноября 2018

Мы используем 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 собирался использовать ldap при каждом следующем (), может быть. Но почему так много задержек?

С rootDN идет очень быстро, 1 секунда, может что-то не так с пользователем, которого он использует для поиска? который явно не является rootDN?

1 Ответ

0 голосов
/ 15 ноября 2018

Apache имеет API-интерфейс LDAP, над которым они работают.Вы можете проверить это здесь .К сожалению, на данный момент документация не очень детализирована.Большое количество страниц в Руководстве пользователя пусто, но вы можете заполнить пробелы с небольшой интуицией и некоторой помощью из JavaDocs .

Даже сотсутствие хороших учебных пособий, я использовал этот API раньше, и мне очень повезло с ним.Я бы посоветовал хотя бы попробовать и посмотреть, улучшится ли ситуация.

...