我們一直在使用 golangdatabase/sql和github.com/lib/pqPostgreSQL 集群,這意味著作為復制主服務器的某個數據庫服務器在先前的主服務器發生故障后可能是只讀副本。最近,我們的低使用率服務設法在其連接池中保留一個連接(沒有會打開第二個連接的并發請求),并且其目標已降級為只讀副本。結果,對服務的每個寫入操作都失敗,直到它重新啟動。如果與集群建立了新連接,就不會發生這種情況。問題是我找不到記錄在案的方法來丟棄某些類型錯誤的連接。唯一database/sql聽起來正確的公共方法是Conn.Close將連接返回到池而不關閉它。不調用它會導致資源泄漏,最終使池無法使用。有沒有一種可持續的方法可以在應用程序需要時擺脫連接?
3 回答

紫衣仙女
TA貢獻1839條經驗 獲得超15個贊
我相信在使用 時database/sql
,答案是“否”,盡管我很樂意得到糾正。
不久前,出于類似的原因(無法控制低級別的連接),我們從database/sql
with切換lib/pq
到純 Go jackc/pgx ,并對結果感到滿意。該模塊提供了ConnPool.Reset
聽起來像你在這里想要的東西:
Reset 關閉所有打開的連接,但讓池保持打開狀態。它旨在用于檢測到會中斷所有連接的錯誤(例如網絡中斷或服務器狀態更改)。
在簽出連接時重置池是安全的。這些連接將在返回池時關閉。

aluckdog
TA貢獻1847條經驗 獲得超7個贊
最好的選擇可能是 Postgres 的DISCONNECT命令。
_, err := conn.ExecContext(context.Background(), "DISCONNECT")
將導致連接從服務器端關閉。

一只斗牛犬
TA貢獻1784條經驗 獲得超2個贊
我認為您可以通過使用 Raw 函數并返回 driver.ErrBadConn 錯誤來丟棄它:
conn.Raw(func(interface{}) error { return driver.ErrBadConn })
- 3 回答
- 0 關注
- 152 瀏覽
添加回答
舉報
0/150
提交
取消