java - 如何修复 java.net.SocketException : Connection reset

标签 java ldap jndi

我很确定我知道问题所在,但我只是不知道如何解决。

我有一个 Java EE 应用程序,可以在 ldap 中进行搜索。我使用 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 分钟(不确定时间),然后搜索将不再工作,我将在控制台中收到连接重置错误。我的猜测是连接已“关闭”,并且由于 ctx 不为空,因此它不会再次进行初始化。我需要帮助来弄清楚要添加到我的 if 语句中以防止发生此错误。也许类似

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

我阅读了 InitialDirContext,但找不到我需要的内容。

最佳答案

不要尝试继续重复使用相同的上下文。每次需要时都获取新的。服务器会在任何需要的时候关闭空闲连接,并且 isClosed() 不会告诉您它何时这样做。

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

关于java - 如何修复 java.net.SocketException : Connection reset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30984699/

相关文章:

java - 在spring中以编程方式获取JNDI资源

java - 使用比较器对列表进行错误排序

java - 如何让这个鼠标监听器只关心一个对象?

java - HSQL + Hibernate 预期异常 : Wrong column type: Found: double,: float

c# - 甲骨文和事件目录 : A love/hate relationship

ldap - liferay 7 使​​用 ldap 与 cas 集成

c# - 如何创建 SearchResponse 类的实例(没有公共(public)构造函数)?

java - 如何在 JDBC 数据源级别限制从 Oracle 返回的行数?

jakarta-ee - 如何使用JNDI访问嵌入式hornetq

java - jsp页面中这两种方法的区别