
生產環境,突然爆發問題,網絡正常,但是報網絡不通錯誤,重啟tomcat立刻好使
開始以為是tomcat的問題,調查了很久,后來加上堆棧日志才發現
簡單來說,就是1-4分鍾之內,使用了大量的http請求,達到了操作系統限制的最大值,所以許多請求處於wait狀態,導致程序錯誤
原代碼,httpClient 未關閉
finally { if (is != null) { is.close(); } if (postMethod != null) { postMethod.releaseConnection(); } }
新代碼,httpClient正確關閉
finally { if (is != null) { try{ is.close(); }catch(Exception e){ } } if(postMethod!=null) postMethod.releaseConnection(); if(httpClient!=null) httpClient.getHttpConnectionManager().closeIdleConnections(0); }
改完這個沒好使...[2018/10/18更新]
繼續查資料,發現與操作系統有關,此程序所在系統是windowsServer2003 32位
修改注冊表
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
新建 DWORD 類型的注冊表項,命名為:MaxUserPort
值數據: 60000(用十進制的格式錄入進去,此值的有效范圍為5000-65534)
新建 DWORD 類型的注冊表項,命名為:TCPTimedWaitDelay
值數據: 30(用十進制的格式錄入進去,TIME_WAIT的自動斷開時間,默認為4分鍾)
HKEY_LOCAL_MACHINE/CurrentControlSet/Services/Tcpip/Parameters下的以下三個參數:
KeepAliveInterval,設置其值為1000(用十進制的格式錄入進去)
KeepAliveTime,設置其值為300000(單位為毫秒,300000代表5分鍾) (用十進制的格式錄入進去)
TcpMaxDataRetransmissions,設置其值為5(用十進制的格式錄入進去)
祝開發順利!
