我有一个通过 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 关注
- 138 浏览
添加回答
举报
0/150
提交
取消