我们使用 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 ?