2014-06-10 56 views
2

的情況:Debian的服務器上TCP存活不工作

  • 的Postgres 9.1
  • 用LISTEN/NOTIFY機制
  • 斯卡拉(Java)的應用程序通過JDBC

得到通知由於可能通知之間非常長的停頓時間(多播時間)我遇到了一段時間後底層TCP連接悄然終止並且我的應用程序停止接收通知的問題。

當找到解決方案時,我發現可以在連接上設置參數tcpKeepAlive。所以我把它設置爲true,很高興。直到第二天,我再次看到我的聯繫已經死亡。

正如我一直懷疑有平行現在證明是非常有用的運行Wireshark的捕獲。在感興趣的連接上的最後一次成功通信之後大約兩個小時,我的應用程序會向數據庫服務器發送一個保持連接的數據包。但服務器迴應RST,因爲它似乎已經關閉了連接。

在服務器上的net.ipv4.tcp_keepalive_time被設置爲7200,其爲2小時。

我需要以某種方式啓用服務器上的Keepalive或增加keepalive_time

這是關於保持我的應用程序連接的方式嗎?

TL; DR:長時間不活動後,我的數據庫連接終止。設置tcpKeepAlive沒有修復它,因爲服務器響應RST。該怎麼辦?

+0

你是否在某種NAT防火牆或路由器後面?如果是這樣,兩個小時可能不夠頻繁。 –

+0

@CraigRinger我不知道託管服務提供商如何組織他的網絡。但是我怎樣才能提高頻率?我沒有看到這樣做的參數。 – mgttlinger

+0

我不認爲PgJDBC目前提供任何控制,所以您必須將其設置爲操作系統級別。 –

回答

1

克雷格提出的問題很可能與一些的網絡硬件在服務器和應用程序之間的意見。解決方法是增加Keepalive消息的頻率。

在我的情況下,操作系統爲視窗,你必須創建一個以毫秒爲單位的空閒時間後應發送的消息的註冊表項。關於這個的信息here

我已經將它設置爲15分鐘,這似乎解決了這個問題。

更新: 它似乎只是它解決了問題。程序運行兩天後,我的連接又一次消失了。我每次使用它時都會切換到檢查連接的有效性。這似乎並不像解決方案,但它仍是一個解決方案。