客戶端應用程序在 10 分鐘不活動後與它連接的數據庫斷開連接
當使用 pgAdmin 4(實際上還有其他幾個充當數據庫客戶端的程序)時,與伺服器的連接會在 10 或 15 分鐘不活動後斷開。一杯咖啡和一個電話,您會收到類似於“對不起,與數據庫的連接失去。您要我嘗試重新連接嗎?”的消息。
並且 pgAdmin 重新連接總是需要不止一次的嘗試,並且已經擴展的對象樹會崩潰……所以,這有點煩人。
pgAdmin 似乎沒有與該行為相關的任何參數。(似乎有一些方法可以更改某些連接超時,但它們與 pgAdmin 在伺服器連接時間過長時的行為方式有關)。
可以做些什麼來避免 pgAdmin 與數據庫斷開連接?
披露:這實際上是一個“偽問題”。它是另一個的衍生產品,最終與失去連接無關……鑑於我已經有了一個答案,我(不是很謙虛)認為值得“詢問”,以防萬一答案對某人有幫助。
pgAdmin 每隔 10 分鐘左右就會拋出一個連接超時。
我認為問題可能與您的 pgAdmin 客戶端和 PostgreSQL 伺服器之間的**路由器(或者,在某些情況下,狀態防火牆)有關。
當您在家(或在辦公室)並且您的路由器正在執行 NAT(網路地址轉換)時,這很常見。經過一段空閒時間後*,路由器*將關閉連接。這不是 pgAdmin 和 PostgreSQL 都沒有做的事情,這取決於路由器上的設置,
如果是這種情況,您有三個選擇:
- 如果可行並且您有適當的文件,請更改路由器中的****connection_timeout設置。這是 Cisco 路由器的範例。
- 讓路由器相信連接永遠不會空閒足夠長的時間。為此:更改一個伺服器參數,稱為
tcp_keep_alives
:根據關於 Connections 的 PostgreSQL 文件:
tcp_keepalives_idle(整數)
指定 TCP 應向客戶端發送 keepalive 消息之前不活動的秒數。值 0 使用系統預設值。此參數僅在支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符號的系統和 Windows 上受支持;在其他系統上,它必須為零。在通過 Unix 域套接字連接的會話中,此參數被忽略並始終讀取為零。
keepalive 消息應避免 NAT 連接開始斷開。
請記住文件中的註釋:
此參數僅在支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符號的系統以及 Windows 上受支持
我真的不知道哪些系統“支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符號”,但我猜 Linux 和 Mac應該支持它們,根據文件,Windows 也是如此。
如果您的系統每 10 分鐘斷開一次連接,則應謹慎將此設置設置為 9 * 60 = 540 秒或更少。
此設置應
postgresql.conf
在您的伺服器上完成。您還可以使用以下命令在伺服器中進行更改之前進行測試:SET tcp_keepalives_idle = 480 ;
這將改變您目前連接的設置,或者
ALTER ROLE (the-one-you-use) tcp_keepalives_idle = 480 ;
這將僅更改此角色的設置。
- 更改客戶端上的 keep_alives 。您不需要更改任何 connection_timeout (該參數是“在確定對方沒有響應之前等待連接多長時間)。按照任何方式在 pgAdmin 中保持連接處於活動狀態而無需設置的已接受答案的說明進行操作它在伺服器上?。它完美地解釋了。
關於 keep-alives 的參考:該影片討論瞭如何保持 SSH 會話保持活躍。雖然這不是完全相同的場景,但它是等效的(用 pgAdmin 代替 SSH)。