微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 如何安全地丢弃golang数据库/ sql池连接,例如当它们指向只读副本时?

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

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

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

解决方法

我相信在使用 database / sql时,答案是“不”,尽管我很乐意纠正.

前段时间,我们从lib / pq的数据库/ sq切换到纯Go jackc/pgx,原因类似(无法控制低级别的连接),并对结果感到满意.该模块提供ConnPool.Reset,听起来像你想要的:

Reset closes all open connections,but leaves the pool open. It is intended for use when an error is detected that would disrupt all connections (such as a network interruption or a server state change).

It is safe to reset a pool while connections are checked out. Those connections will be closed when they are returned to the pool.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐