【发布时间】:2018-10-24 14:05:32
【问题描述】:
在一段时间不活动后,我的 go web 服务在执行第一个 postgres sql 查询时收到带有消息 read tcp x.x.x.x:52086->x.x.x.x:24414: read: connection reset by peer 的 net.OpError。报错之后,后续的请求就可以正常工作了。
postgres 数据库由 compose.com 托管,它在 postgres 数据库前面有 haproxy。我的 Go Web 应用程序使用标准 sql 和 sqlx。
我尝试过每 15 分钟运行一次调用 db.Ping() 的代码,但这并没有解决问题。
为什么 go 标准 sql lib 不处理这些连接丢失?
【问题讨论】:
-
您希望在这里得到什么?如果连接被重置,您需要重新连接。
-
我正在使用 go 标准库
sql.Open用于处理连接池的东西,所以我不能简单地重新连接。同样正如我所提到的,在错误发生后,后续查询可以正常进行。为了清楚起见,我会更新问题。 -
嗯,好的。这里的最后一段似乎暗示了相反的情况。 go-database-sql.org/errors.html
-
猜测:与 haproxy 的连接仍然存在,但与后端的连接超时并且 haproxy 并没有关闭另一端。我在 redis 上看到过类似的问题。如果你不使用 haproxy 会发生什么?定期 ping 不会有太大帮助,因为无法保证任一池中的所有连接都会在超时之前看到一些流量。
-
是的,我想我可能刚刚得出了类似的结论。我正在考虑设置
db.SetConnMaxLifetime(time.Minute * 15),我认为应该清除死连接。
标签: postgresql go haproxy compose-db sqlx