我们正在使用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吗?
答案 0 :(得分:1)
Apache具有正在使用的LDAP API。您可以检出here。不幸的是,此时文档还不够充实。 User Guide上有很多页面是空的,但是您可以凭直觉和JavaDocs的一些帮助来填补空白。
即使缺少良好的教程,我也曾经使用过此API,并很幸运。我建议至少尝试一下,看看情况是否有所改善。