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

lib/pq postgres 驱动程序中的连接泄漏

lib/pq postgres 驱动程序中的连接泄漏

Go
暮色呼如 2022-04-26 14:54:21
鉴于它db是类型*sql.DB(uginglib/pq驱动程序),以下代码会导致连接泄漏:    rows, err := db.Query(        "select 1 from things where id = $1",        thing,    )    if err != nil {        return nil, fmt.Errorf("can't select thing (%d): %w", thing, err)    }    found := false    for rows.Next() {        found = true        break    }反复调用此代码会增加打开连接的数量,直到用尽:select sum(numbackends) from pg_stat_database;// 5// 6// 7// ...// 80我如何解决它?
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您编写的代码存在一些问题。避免连接泄漏问题的直接答案是关闭文档中提到rows的迭代器。调用它的正常方式是在语句中:defer


    rows, err := db.Query(

        "select 1 from things where id = $1",

        thing,

    )

    if err != nil {

        return nil, fmt.Errorf("can't select thing (%d): %w", thing, err)

    }

    defer rows.Close()


    found := false


    for rows.Next() {

        found = true

        break

    }

其次,由于您只关心单个结果,因此根本没有理由获取多行结果集,这也将隐式解决连接泄漏问题。有关在 Postgres 中检查存在的最快方法的讨论,请参阅这篇文章。如果我们在这里调整:


    row, err := db.QueryRow(

        "select EXISTS(SELECT 1 from things where id = $1)",

        thing,

    )

    if err != nil {

        return nil, fmt.Errorf("can't select thing (%d): %w", thing, err)

    }

    var found bool

    if err := row.Scan(&found); err != nil {

        return nil, fmt.Errorf("Failed to scan result: %w", err)

    }


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

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