我们的 LDAP 和 Java 服务器存在一些性能问题。每当我们调用 LDAP 查询时,它看起来像这样(&(objectclass=person)(department=0128)(departmentNumber=1))大约需要 2000 毫秒,这对我们来说太慢了。
但是,如果我们使用标准 LDAP 浏览器(例如来自网络的 LDAP Admin 程序)使用相同的查询执行搜索,则只需几毫秒。
我们的简化代码如下:
public static void main(String[] args) throws NamingException {
Hashtable<String, String> env = new Hashtable<String, String>(); // NOPMD
env.put(Context.PROVIDER_URL, "ldap://abc123.muc:389");
env.put(Context.SECURITY_PRINCIPAL, "CN=myproject,OU=projectusers,DC=COM");
env.put(Context.SECURITY_CREDENTIALS, "asdf");
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
LdapContext iLeanLdapCtx = new InitialLdapContext(env, null);
//TIME TO CREATE CONTEXT = 40ms
String filter = "(&(objectclass=person)(department=0128)(departmentNumber=1))";
NamingEnumeration<SearchResult> results = iLeanLdapCtx.search("O=computers,DC=COM", filter, null);
//TIME TO SEARCH WITH FILTER = 2000ms
NamingEnumeration<SearchResult> results2 = iLeanLdapCtx.search("O=computers,DC=COM", filter, null);
//2nd TIME TO SEARCH WITH FILTER = 2000ms
}
这里有一些初始化问题吗?
我认为实例化 LdapContext 应该已经解决了所有时间密集的问题。ldapCtx.search大约需要 2 秒,如果我再次调用它,仍然是 2 秒。所以最初的搜索似乎没有做任何初始化。即使查询只是那么慢,为什么我使用的其他 LDAP 浏览器会这么快呢?