亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

微服務使 postgres 連接倍增

微服務使 postgres 連接倍增

Go
DIEA 2023-05-22 17:04:27
我有一個通過 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()您基本上永遠不會達到自動關閉條件,并且總是讓您的連接保持打開狀態。


查看完整回答
反對 回復 2023-05-22
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號