LDAPS从Java绑定性能

LDAPS从Java绑定性能,java,ldap,Java,Ldap,我使用下面的代码对来自独立java应用程序的用户进行身份验证: import java.util.Hashtable; import javax.naming.Context; import javax.naming.directory.InitialDirContext; public class Authenticate { public static void main(String[] args) { try { Hashtable<Strin

我使用下面的代码对来自独立java应用程序的用户进行身份验证:

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.directory.InitialDirContext;


public class Authenticate
{
public static void main(String[] args)
{
    try
    {
        Hashtable<String, String> env = new Hashtable<String, String>();

        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "LDAPS://my_ldap_server:636");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL,
            "CN=0@0.com,CN=myCustomers,CN=PartX,DC=testCom,DC=local");
        env.put(Context.SECURITY_CREDENTIALS, "user_password");
        env.put(Context.SECURITY_PROTOCOL, "ssl");

        for (int i = 0; i < 50; i++)
        {
            long start = System.currentTimeMillis();
            new InitialDirContext(env);
            // send request, wait for response
            long end = System.currentTimeMillis();
            System.out.println("Round trip response time = "
                + (end - start) + " millis");
        }

        System.out.println("Welcome");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}
import java.util.Hashtable;
导入javax.naming.Context;
导入javax.naming.directory.InitialDirContext;
公共类身份验证
{
公共静态void main(字符串[]args)
{
尝试
{
Hashtable env=新的Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
put(Context.PROVIDER\u URL,“LDAPS://my\u ldap\u server:636”);
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY_负责人,
“中国=0@0.com,CN=myCustomers,CN=PartX,DC=testCom,DC=local”);
环境put(Context.SECURITY_凭证,“用户密码”);
环境保护协议(Context.SECURITY_PROTOCOL,ssl);
对于(int i=0;i<50;i++)
{
长启动=System.currentTimeMillis();
新环境;
//发送请求,等待响应
long end=System.currentTimeMillis();
System.out.println(“往返响应时间=”
+(结束-开始)+“毫秒”);
}
System.out.println(“欢迎”);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
}
我每次绑定的响应时间接近200毫秒,这是非常高的。我的问题是,当从java执行LDAP绑定时,其他人看到了什么样的响应时间

必须有其他方法来根据LDAP绑定用户。请分享你的方法。我有一个绑定操作的.NET实现,执行时间大约为20毫秒。任何建议都会有所帮助

提前谢谢

  • 你的测试无效。您没有关闭InitialContext。在普通系统中,您可能会启用LDAP连接池,这将完全改变情况
  • LDAP绑定并不是一个决定速率的步骤,但我很确定我的绑定速度比这个快
  • 在Java JNDI中,通过LDAP进行绑定的唯一其他方法是通过
    LdapContext.reconnect()
    ,但在幕后,它将在网络上执行完全相同的操作

  • 根据Oracle对LDAP/LDAPS身份验证的实现(无论是否使用连接池),将创建一个LDAPClient。此lDAPClient创建LDAPConnection,并在执行绑定/身份验证后关闭连接

    如果连接池属性设置为true,则仅当安全主体和密码相同时,才会使用池连接

    对于一个拥有一百万用户的web应用程序,我们不应该共享连接。这将使ldap服务器过载

    ldap客户端和连接代码位于JavaRT.jar中。在ldaps/ssl的情况下,与没有ssl的ldap相比,会观察到延迟

    如果找到一种方法,指示ldap客户机使用相同的ldap连接对象(就像我们对jdbc连接所做的那样),那么ldap身份验证可以大大优化

    当我们试图只搜索用户时,Ldap连接池是有意义的,而不是当我们试图执行身份验证时


    简言之,我同意原来的海报。使用LDAPS身份验证时存在性能延迟。我还想听听其他的经验。

    池连接如何使LDAP服务器过载,而不是池连接如何使其过载?连接池与“指示ldap客户端使用同一ldap连接对象的方式……有什么不同?”专家您好。还有其他输入吗?特别是其他java实现绑定用户看到的响应时间。