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

标签 sql database go

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

最佳答案

DB 会尽最大努力检测,但运气不好,它可能无法检测到。最好尽快发布获得的内容。

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

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

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

因此,它可能会阻止

  1. 正常关闭集群。
  2. 推进事件视界,如果它持有独占锁作为事务的一部分,例如 postgresql 中的 auto vacuum

可以缩短服务器保持事件配置以更早地检测到它。 (比如postgresql默认的~2h 12m根据工作量会很长)。

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

关于sql - 在 Go 中关闭应用程序之前是否需要关闭数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175299/

相关文章:

go - 如果连接丢失,如何使 net.Dial in Go 重新连接?

go - 想要使用 Go 程序运行具有标志和参数的二进制文件

sql - 如何在 SQL 中将 json 属性从一个记录值移至新记录值

database - MapDB 与常规数据库

mysql - 如何使用 Peewee 将 Jupyter Notebook 连接到远程 MySQL 数据库?

去 http 请求检测 POST 为 GET

仅当元素与 sql 相同时,Php 才回显用户信息

sql - 等待数据库引擎恢复句柄失败。检查 SQL Server 错误日志以了解潜在原因

php - 使用 Sql 查询显示变量的错误值

iphone - 如何将大量数据从文件导入到应用程序内部的 sqlite(实时)