我很确定我知道问题所在,但我只是不知道如何解决。
我有一个 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/