recherche ldap est très lent
Je suis en utilisant JNDI pour se connecter à l'annuaire LDAP active directory, et je veux rechercher des utilisateurs dont le nom contient la chaîne de recherche, donc ma méthode de recherche est la suivante:
public static List<LDAPUser> searchContactsByName(
ExtendedDirContext extendedDirContext, String name) {
try {
LdapContext ldapContext = extendedDirContext.getLdapContext();
String searchBaseStr = extendedDirContext.getSearchBase();
String sortKey = LDAPAttributes.NAME;
ldapContext.setRequestControls(new Control[] { new SortControl(
sortKey, Control.CRITICAL) });
SearchControls searchCtls = new SearchControls();
searchCtls.setTimeLimit(1000 * 10);
String returnedAtts[] = { LDAPAttributes.USER_NAME,
LDAPAttributes.NAME };
searchCtls.setReturningAttributes(returnedAtts);
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String searchFilter = "(&(ObjectCategory=person)(cn=*" + name
+ "*))";
NamingEnumeration<SearchResult> results = ldapContext.search(
searchBaseStr, searchFilter, searchCtls);
List<LDAPUser> users = new ArrayList<LDAPUser>(0);
while (results.hasMoreElements()) {
SearchResult sr = (SearchResult) results.next();
Attributes attrs = sr.getAttributes();
LDAPUser user = new LDAPUser();
user.setName(attrs.get(LDAPAttributes.NAME).toString()
.replace("cn: ", ""));
user.setUserName(attrs.get(LDAPAttributes.USER_NAME).toString()
.replace("sAMAccountName: ", ""));
users.add(user);
}
return users;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
et voici comment j'ai fais la connexion LDAP:
public static ExtendedDirContext connectToLdap(MessageSource messageSource) {
try {
log.debug("connectToLdap");
String providerUrl = messageSource.getMessage("provider.url", null,
null);
String securityPrincipal = messageSource.getMessage(
"security.principal", null, null);
String securityCredentials = messageSource.getMessage(
"security.credentials", null, null);
String searchBase = messageSource.getMessage("search.base", null,
null);
boolean ssl = Boolean.parseBoolean(messageSource.getMessage("ssl",
null, null));
LdapContext ldapContext;
Hashtable<String, String> ldapEnv = new Hashtable<String, String>(
11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
ldapEnv.put(Context.PROVIDER_URL, providerUrl);
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, securityPrincipal);
ldapEnv.put(Context.SECURITY_CREDENTIALS, securityCredentials);
if (ssl)
ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
//To get rid of the PartialResultException when using Active
//Directory
ldapEnv.put(Context.REFERRAL, "follow");
ldapContext = new InitialLdapContext(ldapEnv, null);
ExtendedDirContext extendedDirContext = new ExtendedDirContext();
extendedDirContext.setLdapContext(ldapContext);
extendedDirContext.setSearchBase(searchBase);
log.debug("success connection to ldap");
return extendedDirContext;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
Les informations d'identification LDAP sont comme suit:
provider.url=ldap://dc.fabrikam.com:389
security.principal=CN=administrator,CN=Users,DC=fabrikam,DC=com
security.credentials=password
search.base=dc=fabrikam,dc=com
Pourquoi la recherche de prendre autant de temps pour récupérer les données? Est-il un changement que je peux faire pour rendre la recherche plus rapide, puisque j'ai seulement 285 contacts dans l'ANNONCE?
Vous effectuez un préfixe de recherche de génériques, qu'attendez-vous? Cela va dans
mais je n'ai pas trop d'utilisateurs dans l'AD, seulement 285.
omettre la première
même comportement, plus de 90 secondes pour obtenir des résultats de recherche, veuillez consulter le post de mise à jour de la façon dont je fais de la connexion ldap.
J'ai trouvé que la modification
O(n)
temps.mais je n'ai pas trop d'utilisateurs dans l'AD, seulement 285.
omettre la première
*
et voir si ça change.même comportement, plus de 90 secondes pour obtenir des résultats de recherche, veuillez consulter le post de mise à jour de la façon dont je fais de la connexion ldap.
J'ai trouvé que la modification
ldapEnv.put(Context.REFERRAL, "follow");
à ldapEnv.put(Context.REFERRAL, "ignore");
fait des recherches assez rapideOriginalL'auteur Mahmoud Saleh | 2013-01-03
Vous devez vous connecter pour publier un commentaire.
Solution a été de changer
ldapEnv.put(Context.REFERRAL, "follow");
àldapEnv.put(Context.REFERRAL, "ignore");
Voici plus d'informations: stackoverflow.com/a/45012054/5162026
OriginalL'auteur Mahmoud Saleh
Votre filtre:
Peut être un problème.
Je vous recommande de télécharger un connu LDAP, utilitaire (Apache Directory Studio Navigateur par exemple) et essayer différents filtres de recherche, jusqu'à ce que vous trouviez celui qui fonctionne.
Pour Commencer, essayez de
OriginalL'auteur jwilleke
Vous avez raison,
n'obtenez pas exception à propos de connection timed out. Mais quand j'essaie tout d'abord, je reçois un partialexception. Après, j'ai changé ma configuration LDAP port à partir de 389 3268 je n'ai pas toute exception, de construire avec succès. 3268 le port de catalogue global de LDAP. Par exemple, les clients Outlook interroger le catalogue global de localiser les informations du Carnet d'Adresses. Vous pouvez essayer de catalogue global si vous obtenez une exception d'aiguillage type de paramètre.
OriginalL'auteur mertaksu