在关闭Go中的应用程序之前是否需要关闭数据库连接?

Rob*_*mba 6 sql database go

在Go中,当使用SQL数据库时,是否需要db.Close在关闭应用程序之前关闭DB()?DB会自动检测到连接已经死亡吗?

fer*_*mas 4

DB会尽力检测,但如果运气不好,它可能无法检测到。获得的东西最好尽快释放。

send()系统调用将等待 TCP 连接发送数据,但客户端不会收到任何内容。

  1. 发生断电、网络问题或裸退出而没有正确释放资源。TCP keepalive 机制将启动并尝试检测连接是否已断开。

  2. 客户端暂停并且不接收任何数据,在这种情况下send()将阻塞。

结果,它可能会阻止

  1. 集群正常关闭。
  2. 如果事件范围持有排它锁作为事务的一部分(例如auto vacuum在 postgresql 中),则推进事件范围。

可以缩短服务器保活配置以更早地检测到它。(例如,~2h 12m根据工作负载,postgresql中默认会很长)。

最大打开连接数可能有硬性限制,直到检测到,某些连接将成为僵尸(在那里,不可用但减少限制)。