微服务使 postgres 连接倍增

我有一个通过 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

}


DIEA
浏览 104回答 1
1回答

慕侠2389804

您需要使用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()您基本上永远不会达到自动关闭条件,并且总是让您的连接保持打开状态。
打开App,查看更多内容
随时随地看视频慕课网APP