登录
首页 >  Golang >  Go问答

安全释放 Golang 数据库/SQL 池连接,确保指向只读副本

来源:stackoverflow

时间:2024-03-24 10:18:41 263浏览 收藏

在使用 Go 的 database/sql 和 lib/pq 管理 PostgreSQL 连接时,当只读副本成为复制主服务器时,连接池可能会保留到只读副本的连接。这会导致写入操作失败,直到重新启动为止。由于 database/sql 中没有方法丢弃特定类型的错误连接,因此无法可持续地摆脱这些连接。虽然使用 jackc/pgx 可以解决此问题,因为它提供 ConnPool.Reset 方法来重置连接池,但使用 database/sql 时,无法避免此问题。

问题内容

我们一直在 PostgreSQL 集群中使用 golang 的 database/sqlgithub.com/lib/pq,这意味着作为复制主服务器的某个数据库服务器在前一个主服务器发生故障后可能会成为只读副本。

最近,我们的低使用率服务设法在其连接池中保留单个连接(没有会打开第二个连接的并发请求),并且其目标已降级为只读副本。因此,对服务的每个写入操作都会失败,直到重新启动为止。如果与集群建立新的连接,这种情况就不会发生。

问题是我找不到记录的方法来放弃某些类型错误的连接。 database/sql 中唯一听起来正确的公共方法是 Conn.Close ,它将连接返回到池而不关闭它。不调用它会导致资源泄漏,最终导致池无法使用。当应用程序需要时,是否有一种可持续的方法可以摆脱连接?


解决方案


我相信,当使用 database/sql 时,答案是“否”,尽管我很乐意得到纠正。

不久前,出于类似的原因(无法控制低级别的连接),我们从 database/sqllib/pq 切换到纯 Go jackc/pgx,并对结果感到满意。该模块提供 ConnPool.Reset,这听起来像您想要的:

理论要掌握,实操不能落!以上关于《安全释放 Golang 数据库/SQL 池连接,确保指向只读副本》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>