在 Go 中,当使用 SQL 数据库时,是否需要在关闭应用程序之前关闭数据库(db.Close
)? DB 会自动检测到连接已断开吗?
最佳答案
DB 会尽最大努力检测,但运气不好,它可能无法检测到。最好尽快发布获得的内容。
send()
系统调用将等待 TCP 连接发送数据,但客户端不会收到任何东西。
在没有正确释放资源的情况下发生电源故障、网络问题或裸退出。 TCP keepalive 机制将启动并尝试检测连接是否已断开。
客户端暂停并且没有收到任何数据,在这种情况下
send()
将阻塞。
因此,它可能会阻止
- 正常关闭集群。
- 推进事件视界,如果它持有独占锁作为事务的一部分,例如 postgresql 中的
auto vacuum
。
可以缩短服务器保持事件配置以更早地检测到它。 (比如postgresql默认的~2h 12m
根据工作量会很长)。
最大打开连接数可能有一个硬性限制,直到检测到,一些连接将成为僵尸连接(在那里,不可用但减少限制)。
关于sql - 在 Go 中关闭应用程序之前是否需要关闭数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175299/