我有一個通過 golang 編寫的服務,它作為消費者工作,它從 kafka 的隊列中獲取數據并將其存儲在 PostgreSQL 數據庫中。在執行某些請求時,golang 開始增加 PG 連接,然后超過它們的限制。我不知道為什么,請幫我解決這個問題。這是代碼:func SaveMessageStatus(msg models.Message) error {db := GetPostgreInstance() // Get *sql.DB instance// Проверяем есть ли записиrows, err := db.Query(`select * from "tNotifStatus" where "NotificationId" = $1`, msg.NotificationID)if err != nil { CheckError(err, "SLCT status", "") return err}if rows.Next() { // Смотрим если запись в таблице уже есть, тогда просто обновляем статусы по сообщению fsql := `update "tNotifStatus" set "Status" = $1, "Error" = $2, "UpdateTime" = $3 where "NotificationId" = $4` _, err = db.Exec(fsql, msg.Status, msg.Error, msg.UpdateTime, msg.NotificationID) if err != nil { //Логируем CheckError(err, "UPDT status", "") return err }} else { // Если записей нет, то создаем новую fsql := `insert into "tNotifStatus" values ($1,$2,$3,$4,$5)` _, err = db.Exec(fsql, msg.NotificationID, msg.Status, msg.Error, msg.ChannelName, msg.UpdateTime) if err != nil { //Логируем CheckError(err, "INS status", "") return err }}return err}
1 回答

慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
您需要使用QueryRow()
, 因為您既不使用也不期望多行,或者做一個defer rows.Close()
(使用時您應該始終這樣做.Query
關閉關閉行,防止進一步枚舉。如果調用 Next 并返回 false 并且沒有進一步的結果集,則 Rows 將自動關閉并且足以檢查 Err 的結果。Close 是冪等的,不會影響 Err 的結果。
如果出于某種原因您退出該循環——提前返回等——那么行不會關閉,連接保持打開狀態。
rows, err := db.Query(`select * from "tNotifStatus" where "NotificationId" = $1`, msg.NotificationID)
if err != nil {
? ? CheckError(err, "SLCT status", "")
? ? return err
}
defer rows.Close()
由于您甚至沒有迭代,所以rows.Next()您基本上永遠不會達到自動關閉條件,并且總是讓您的連接保持打開狀態。
- 1 回答
- 0 關注
- 160 瀏覽
添加回答
舉報
0/150
提交
取消