我有一個通過 golang 編寫的服務(wù),它作為消費者工作,它從 kafka 的隊列中獲取數(shù)據(jù)并將其存儲在 PostgreSQL 數(shù)據(jù)庫中。在執(zhí)行某些請求時,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條經(jīng)驗 獲得超6個贊
您需要使用QueryRow()
, 因為您既不使用也不期望多行,或者做一個defer rows.Close()
(使用時您應(yīng)該始終這樣做.Query
關(guān)閉關(guān)閉行,防止進一步枚舉。如果調(diào)用 Next 并返回 false 并且沒有進一步的結(jié)果集,則 Rows 將自動關(guān)閉并且足以檢查 Err 的結(jié)果。Close 是冪等的,不會影響 Err 的結(jié)果。
如果出于某種原因您退出該循環(huán)——提前返回等——那么行不會關(guān)閉,連接保持打開狀態(tài)。
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()您基本上永遠不會達到自動關(guān)閉條件,并且總是讓您的連接保持打開狀態(tài)。
- 1 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報
0/150
提交
取消