如何修复java.net.SocketException:连接重置

时间:2015-06-22 16:04:33

标签: java ldap jndi

我很确定我知道这个问题,我只是不知道如何解决它。

我有一个在ldap中进行搜索的java EE应用程序。我用getEnv初始化上下文:

(注意*:为了理解目的,代码有点简化)

InitialDirContext ctx = new InitialDirContext( getEnv( CONFIG_MAP ); //CONFIG_MAP contains  the host, mng_dn, mng_pw

public static Hashtable<String, String> getEnv( Map<String, String> configMap ) {

    // Hashtable for environmental information
    Hashtable<String, String> env = new Hashtable<String, String>();

    // Specify which class to use for our JNDI Provider
    env.put( Context.INITIAL_CONTEXT_FACTORY, INITCTX );

    // Specify the host and port to use for directory service
    env.put( Context.PROVIDER_URL, configMap.get( HOST ) );

    // Security Information
    env.put( Context.SECURITY_AUTHENTICATION, "simple" );
    env.put( Context.SECURITY_PRINCIPAL, configMap.get( MGR_DN ) );
    env.put( Context.SECURITY_CREDENTIALS, configMap.get( MGR_PW ) );
    env.put( "java.naming.ldap.attributes.binary", "objectSID" );

    return env;
}

我不知道这是不好的做法,但为了防止在每次搜索之前发生初始化,我做了一个Init函数:

if(Util.ctx == null ){
    Util.init()
}

所以问题来自这里。我的应用程序将工作大约30分钟(不确定时间),然后搜索不再工作,我将在控制台中收到连接重置错误。我的猜测是连接已关闭&#34;并且它没有再次进行初始化,因为ctx不为null。我需要帮助来弄清楚要添加到我的if语句中的内容,以防止发生此错误。也许像是

if(Util.ctx == null || Util.ctx.isClosed() ){
    Util.init();
}

我在InitialDirContext上阅读,无法找到我需要的东西。

2 个答案:

答案 0 :(得分:2)

不要试图继续重复使用相同的Context。每次需要时都要换一个新的。服务器会在任何时候关闭空闲连接,isClosed()不会告诉你它什么时候这样做。

您可以使用JNDI LDAP连接池功能来保存连接。

答案 1 :(得分:1)

如何设置无超时如下:

// Set up environment for creating initial context
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");

// Specify time-out to be infinite time . make it like never expired
env.put("com.sun.jndi.ldap.connect.timeout", "-1");

// Create initial context
DirContext ctx = new InitialDirContext(env);

您可以在以后需要时关闭它,如下所示:

finally {

        if (obj instanceof Context) {

            Context ctx = (Context) obj;
            try {
                ctx.close();
            }
            catch (Exception e) {

            }

        }
    }

检查一下: https://docs.oracle.com/javase/tutorial/jndi/newstuff/readtimeout.html