首页 >后端开发 >Golang >在 Go 中插入行时如何避免 Postgres 连接池耗尽?

在 Go 中插入行时如何避免 Postgres 连接池耗尽?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-13 02:59:09145浏览

How to Avoid Postgres Connection Pool Exhaustion When Inserting Rows in Go?

Go 中行插入的可重用 Postgres 数据库连接:解决连接池耗尽

目标是使用单个可重用 Postgres 数据库连接用于 Go 中的行插入。该错误是由于连接处理不当导致代码无意中打开多个连接而引起的。

Postgres 的连接池机制 sql.DB 维护的是连接缓存而不是单个连接。它根据需要动态分配连接,最高可达 Postgres 服务器的最大连接限制。但是,当使用 QueryRow 时,如果不对返回的 Row 值调用 Scan,则无法正确释放连接。

内部保存 Rows 实例的 Row 对象管理其自己的连接。仅当调用 Scan 时,连接才会自动释放。忽略调用 Scan 会保持连接被占用,从而迫使 DB 在后续 QueryRow 调用中打开新连接。由于在没有释放连接的情况下发生这种情况,池会耗尽,问题就会出现。

要解决此问题,您可以采用以下任一方法:

  • 如果结果是,则使用 E​​xec查询无关紧要。
  • 在返回的 *Row 上调用 Scan 以释放

这是包含这些更改的修订后的代码片段:

// ...

func main() {

    // ...

    // msg handling

    sqlStatement := `
    INSERT INTO heartbeat ("Legend", "Status", "TimeStamp")
    VALUES (, , )
    `

    row := db.QueryRow(sqlStatement, Legend, Status, TimeStamp)
    row.Scan(&dummy)  // dummy variable to discard the result

    // ...

}

// ...

这可确保连接及时释放,防止数据库连接池耗尽。

以上是在 Go 中插入行时如何避免 Postgres 连接池耗尽?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn