bor*_*ini 5 postgresql go database-replication
我们一直在使用golang database/sql和github.com/lib/pqPostgreSQL集群,这意味着作为复制主机的某个数据库服务器可能是在前一个主机发生故障后的只读副本.
最近,我们的低使用率服务设法在其连接池中保留单个连接(没有可以打开第二个连接的并发请求),并且其目标已降级为只读副本.因此,对服务的每个写入操作都会失败,直到重新启动为止.如果与群集建立了新连接,那就不会发生这种情况.
问题是我找不到记录的方法来丢弃某些类型的错误的连接.database/sql声音正确的唯一公共方法是Conn.Close将连接返回到池而不关闭它.不调用它会导致资源泄漏,最终导致池无法使用.在应用程序想要时,是否有可持续的方法来摆脱连接?
我相信在使用时database/sql,答案是“否”,尽管我很乐意被纠正。
不久前,出于类似的原因(无法控制低级别的连接),我们从database/sqlwith切换lib/pq到纯 Go jackc/pgx ,并对结果感到满意。该模块提供的功能ConnPool.Reset听起来像您想要的:
重置会关闭所有打开的连接,但使池保持打开状态。它适用于检测到会中断所有连接的错误(例如网络中断或服务器状态更改)时使用。
在签出连接时重置池是安全的。当这些连接返回到池中时,它们将被关闭。