问题描述
在LDAP测试期间出现了一个错误情况,因此我正在对此进行一些研究。每当请求进入我的Java API时,我都会设置环境详细信息并加载一个新的InitialDirContext实例。下面是我编写的用于测试LDAP的代码:
public static void main(final String[] args) throws NamingException {
final String ldapServerURI = "uri";
final int connTimeout = 2000;
final String ldapUsername = "username";
final String ldapPassword = "password";
final int readTimeout = 3000;
final boolean enableTraceLogin = true;
final Logger logger = LoggerFactory.getLogger(ContextCreation.class);
final ContextCreation contextCreation = new ContextCreation(logger);
contextCreation.getSearchResults(ldapServerURI,ldapUsername,ldapPassword,readTimeout,connTimeout,enableTraceLogin);
System.out.println("First call done");
contextCreation.getSearchResults(ldapServerURI,enableTraceLogin);
System.out.println("Second call done");
}
public NamingEnumeration<SearchResult> getSearchResults(final String ldapServerURI,final String ldapUsername,final String ldapPassword,final int readTimeout,final int connTimeout,final boolean enableTraceLogin)
throws NamingException {
final long timeInmillis = 0;
DirContext ctx = null;
final NamingEnumeration<SearchResult> results = null;
try {
ctx = getInitialDirContext(
createEnvironment(ldapServerURI,enableTraceLogin));
} catch (final NamingException e) {
throw e;
}
finally {
closeContext(ctx);
LOGGER.info(TOTAL_TIME_TAKEN_LOG,System.currentTimeMillis() - timeInmillis);
}
return results;
}
private Hashtable<String,Object> createEnvironment(final String ldapServerURI,final int timeout,final boolean enableTraceLogin) {
final Hashtable<String,Object> env = new Hashtable<String,Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,ldapServerURI);
env.put("com.sun.jndi.ldap.read.timeout",String.valueOf(timeout));
env.put("com.sun.jndi.ldap.connect.timeout",String.valueOf(connTimeout));
env.put(Context.SECURITY_AUTHENTICATION,"simple");
env.put("javax.security.sasl.qop","auth-conf");
env.put("com.sun.jndi.ldap.connect.pool","true");
env.put("com.sun.jndi.ldap.connect.pool.maxsize",50);
env.put("com.sun.jndi.ldap.connect.pool.initsixze",20);
env.put("com.sun.jndi.ldap.connect.pool.prefsize",20);
env.put("com.sun.jndi.ldap.connect.pool.authentication","simple");
if (ldapUsername != null) {
env.put(Context.SECURITY_PRINCIPAL,ldapUsername);
}
if (ldapPassword != null) {
env.put(Context.SECURITY_CREDENTIALS,ldapPassword);
}
return env;
}
private void closeContext(final DirContext ctx) {
if (ctx != null) {
try {
ctx.close();
} catch (final Exception closeProblem) {
LOGGER.error("error closing Context - ",closeProblem);
}
}
}
DirContext getInitialDirContext(final Hashtable<String,Object> env) throws NamingException {
final long timeinMillis = System.currentTimeMillis();
try {
return new InitialDirContext(env);
} finally {
LOGGER.info("Total time taken for creating the LDAP Initial Context in Millis [{}]",System.currentTimeMillis() - timeinMillis);
}
}
在测试期间,我在一秒钟内多次调用方法getSearchResults
,整个线程被挂起。当我检查时,能够看到它正在等待InitialDirContext被创建。我想知道为什么会这样。
有没有办法查看ctx对象使用的连接?
根据Oracle文档,我应该在代码中利用池化功能。任何帮助将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)