2009-12-09 38 views

回答

2

在Java Web開發方面,一個破碎管連接重置基本上意味着對方已經關閉了連接。在請求仍在運行時,客戶端按下Esc可能會導致這種情況,但請求仍在運行,或者在請求仍在運行時通過鏈接/書籤/地址欄導航。您經常在長時間運行的請求中看到此特定錯誤,例如大文件下載和不必要的大/慢業務任務(這對於不耐煩的用戶不好,大約3秒真是最大)。在極少數情況下,它也可能由硬件/網絡問題引起,如服務器或客戶端的網絡中斷。

當響應的輸出流上的flush()close()被調用時,可以拋出此異常。你作爲服務器端無法對付它。由於HTTP中的安全限制,您無法(重新)連接客戶端,因此無法從中恢復。在大多數情況下,你也不應該嘗試,因爲這往往是客戶自己的決定。只需忽略它或將其記錄爲純粹的統計數據。

1

其他原因之一通常是操作系統上的TCP/IP堆棧設置。還沒有在Linux上嘗試過它,但我曾經工作過的一個平臺是Sun的Solaris 9/10操作系統。基本思想是Solaris具有可調諧的TCP/IP堆棧,您可以在運行Web應用程序時對其進行調整。

所以有兩個參數,你應該知道

  • 了tcp_conn_req_max_q0的 - 完全握手
  • 的tcp_keepalive_interval的隊列 - - 存活
  • 不完整的握手
  • tcp_conn_req_max_q1的隊列
  • tcp_time_wait_interval - 一個被認爲活着 互聯網中的TCP段的時間

所有上述參數的影響有多大負荷可製取(從TCP/IP的角度),並在另一面影響某些類型的發生SocketExceptions - 例如BalusC指出的那些。

這顯然是相當複雜的,但我試圖做的一點是,您經常託管您的應用程序的操作系統,爲您提供緩解策略。

相關問題