我很确定我知道这个问题,我只是不知道如何解决它。
我有一个在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上阅读,无法找到我需要的东西。
答案 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