我很確定我知道這個問題,我只是不知道如何解決它。如何解決java.net.SocketException:連接重置
我有一個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;
}
我不知道這是不好的做法,但爲了防止從初始化之前發生的每搜索我做了一個初始化函數,它:
if(Util.ctx == null){
Util.init()
}
所以,問題來自於這裏。我的應用程序將工作大約30分鐘(不確定的時間),然後搜索將不再工作,我會在我的控制檯中得到連接重置錯誤。我的猜測是連接是「關閉的」,並且它不再執行初始化,因爲ctx不爲空。我需要幫助來找出要添加到我的if語句以防止發生此錯誤。也許類似
if(Util.ctx == null || Util.ctx.isClosed()){
Util.init();
}
我讀了InitialDirContext並找不到我需要的東西。
這種方式應用程序服務器將始終保持連接到我的LDAP服務器,除非我重新啓動應用程序服務器?難道這從長遠來看不會造成問題嗎? – trixrabbit
我認爲你是對的。但問題是,您可以通過添加finally try catch塊來關閉連接並在需要時將其返回到連接池。我的意思是你需要明確地在你需要的地方關閉它,看看更新後的答案。不知道這是否有幫助。 – Jegg
它確實有幫助,但我無法弄清楚什麼時候我想關閉它。我的應用程序是我們內部網的一個Web應用程序,它允許用戶搜索其他人的信息(電子郵件,電話等),例如目錄。我在加載搜索頁面時執行init()。我只在本地主機上測試過,所以我不確定這將如何與許多用戶一起工作。我認爲服務器在用戶到達搜索頁面時執行一次init(),然後未來的用戶將跳過init()。 – trixrabbit