Go 中行插入的可重用 Postgres 数据库连接:解决连接池耗尽
目标是使用单个可重用 Postgres 数据库连接用于 Go 中的行插入。该错误是由于连接处理不当导致代码无意中打开多个连接而引起的。
Postgres 的连接池机制 sql.DB 维护的是连接缓存而不是单个连接。它根据需要动态分配连接,最高可达 Postgres 服务器的最大连接限制。但是,当使用 QueryRow 时,如果不对返回的 Row 值调用 Scan,则无法正确释放连接。
内部保存 Rows 实例的 Row 对象管理其自己的连接。仅当调用 Scan 时,连接才会自动释放。忽略调用 Scan 会保持连接被占用,从而迫使 DB 在后续 QueryRow 调用中打开新连接。由于在没有释放连接的情况下发生这种情况,池会耗尽,问题就会出现。
要解决此问题,您可以采用以下任一方法:
这是包含这些更改的修订后的代码片段:
// ... 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中文网其他相关文章!