title: ldap search is very slow
body: <p>I am using JNDI to connect to the LDAP active directory, and I want to search for users where the name contains the search string, so my search method is as follows:</p>
  
  <pre><code>public static List&lt;LDAPUser&gt; 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 = "(&amp;(ObjectCategory=person)(cn=*" + name
                  + "*))";
  
          NamingEnumeration&lt;SearchResult&gt; results = ldapContext.search(
                  searchBaseStr, searchFilter, searchCtls);
  
          List&lt;LDAPUser&gt; users = new ArrayList&lt;LDAPUser&gt;(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;
      }
  }
  </code></pre>
  
  <p>and here is how I am making the connection to LDAP:</p>
  
  <pre><code>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&lt;String, String&gt; ldapEnv = new Hashtable&lt;String, String&gt;(
                  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;
      }
  
  }
  </code></pre>
  
  <p>The LDAP credentials are as follows:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>Why does the search take so much time to retrieve the data? Is there any change that I can do to make the search faster, since I have only 285 contacts in the AD?</p>