Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-jndildap慢速搜索_Java_Performance_Ldap_Jndi_Openldap - Fatal编程技术网

Java-jndildap慢速搜索

Java-jndildap慢速搜索,java,performance,ldap,jndi,openldap,Java,Performance,Ldap,Jndi,Openldap,我们使用javax.naming.ldap.LdapContext来连接和查询openLdap 问题是我们得到的结果是com.sun.jndi.ldap.LdapSearchEnumeration,循环速度非常慢,比如每秒5次搜索结果 我也尝试过ApacheLDAP api,我得到的次数也一样,除非我带的atributes更少,但速度仍然很慢。获得180个结果需要10秒 jndi ldap的代码示例: Hashtable env = new Hashtable(); env

我们使用javax.naming.ldap.LdapContext来连接和查询openLdap

问题是我们得到的结果是com.sun.jndi.ldap.LdapSearchEnumeration,循环速度非常慢,比如每秒5次搜索结果

我也尝试过ApacheLDAP api,我得到的次数也一样,除非我带的atributes更少,但速度仍然很慢。获得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();
        }
Hashtable env=new Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER\u URL,“ldap://aplivolatil....:389");
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY\u PRINCIPAL,“uid=usuarioLector…”;
环境投入(Context.SECURITY_凭证,“9IVNOaQmEeE”);
环境投入(Context.BATCHSIZE,“1000”);
环境投入(Context.reference,“忽略”);
LdapContext-contexto;
试一试{
//contexto=新的InitialLdapContext(env,null);
contexto=新的InitialLdapContext(env,null);
SearchControls ControlsBusqueda=新的SearchControls();
字符串[]attrs=新字符串[]{“cn”};
控制总线数据。设置返回属性(属性);
控制总线。设置示波器(1);
NamingEnumeration ResultaDosObjectos=contexto.search(“cn=usuarios-…”,
“(&(objectClass=inetOrgPerson))”,controlesBusqueda);
while(resultadosObjetos.hasMore()){
resultadosObjectos.next();
}
因此,在调查和几次测试之后,我们发现,将jndi ldap环境属性“batchsize”设置为1000时,搜索方法也会有相同的延迟,而不是在循环结果时。这在某种程度上是有意义的,因为api可能会在每一次()上访问ldap。但为什么会有这么多延迟呢


如果rootDN运行速度非常快,仅需1秒钟,那么im用于搜索的用户可能会出现问题吗?这显然不是rootDN?

Apache有一个他们正在使用的LDAP API。您可以查看它。不幸的是,文档在这一点上并不是很充实。上的许多页面都是空的,但您可以填写它他凭着一点直觉和来自政府的一些帮助


即使缺少好的教程,我以前也使用过这个API,而且运气不错。我建议至少尝试一下,看看情况是否有所改善。

我使用apache ldap API时也遇到了同样的问题,但我注意到,如果查询较少的atributes,循环速度会加快。例如,180个寄存器从37秒增加到10秒econds,这比获得所有atributes都好。但我不明白,为什么循环结果如此缓慢?我确认它不会再次进入ldap,那么我是否遗漏了一些东西?我将添加上面的代码示例。由于这两种实现的速度都很慢,这让我相信它与实际数据本身有关。不总之,我不完全确定如何使循环更快。我建议输入计时器,看看哪个调用占用的时间最多。是
cursor.next()
Entry=cursor.get();
,还是实际上是
System.out.println()
call?设置一个记录器,查看哪一个有故障,并查看它是否总是有故障,或者只是针对它循环通过的某些值。我也在phpldapadmin上测试了相同的查询,它需要1秒,所以我猜它与Java有关。它不是循环,因为我将jndi ldap环境porperty batchsize设置为1000,现在是search方法具有相同的延迟,但循环是瞬时的。我将更新问题。是用户(安全性原则)!!我不知道为什么,我将继续调查。rootDN速度非常快,1秒。我用于搜索的用户可能有什么问题?显然不是rootDN。