LDAP初始上下文基础连接

问题描述

在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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...