为了账号安全,请及时绑定邮箱和手机立即绑定

微服务使 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 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信