7

我一直认为关闭数据库连接总是一个好习惯,无论数据库/ORM如何,比如mysql_close()、Propel::close()等。

参考我的另一个问题和 Internet 上的其他一些研究,我了解到一张令人惊讶的面孔,大多数人建议关闭连接并不重要,因为连接总是在请求后关闭。

但是,我发现这些答案很难消化。原因是,为什么所有的 DB lib、ORM 都提供 close 方法?如果它在那里,在每个 ORM/lib中,都必须有一些很好的用途。

有人可以解释一下在什么情况下,我们应该使用 close 方法来关闭数据库连接?&如果这些方法根本没有用,为什么它们存在于所有 db libs/ORM 中?

编辑

我的结论

这是 Bondye 和 Fluffeh 之间的一次很好的讨论,它消除了我对使用连接关闭的疑虑。感谢他们俩。

  • 如果您的脚本预计持续时间少于 100 毫秒,请不要费心关闭连接。
  • 但是:如果脚本预计会持续更长时间,并且在最后一次数据库操作和脚本关闭之间有一段时间,请通过调用 *close() 为其他人释放连接。

我真的很难接受一个答案,因为两个答案都是正确的。只需接受所有评论的答案,使其保持在首位。但是对两个正确答案+1。

4

4 回答 4

8

mysql_close()通常不需要使用,因为非持久打开的链接会在脚本执行结束时自动关闭。

释放资源

感谢 PHP 4 的 Zend 引擎引入的引用计数系统,自动检测到不再引用它的资源,并被垃圾收集器释放。因此,很少需要手动释放内存。

希望这对您有更多帮助。

来源

编辑:

的目的mysql_close()也是为了节省计算机资源,但使用它的另一个关键原因是因为 MySQL 服务器可以接受的连接数量有限,如果您有多个客户端无缘无故地保持连接打开,那么服务器可能会很好需要拒绝其他等待的客户。这自然是一件坏事,因此,与 一样,如果您认为在最后一次使用数据库和脚本结束之间会有一段时间mysql_free_result(),最好调用。mysql_close()

于 2012-09-11T09:27:15.097 回答
6

当您不再需要数据库连接时,最好关闭它。即使它在脚本结束后自动关闭 - 这可能是另一秒钟或几秒钟后。如果您不再需要它,一个用户点击一个页面并浪费数据库连接半秒钟不会有什么不同——但是一次做 20 个人会突然打开连接 10 秒钟——这确实会产生影响。

同时,重新使用连接可能是一种很好的做法——建立和打开连接通常至少需要几毫秒——如果你要插入几十万行,那么每次几毫秒的时间确实加起来快速地。

在某种程度上,将变量设置为 NULL 或取消设置没有什么不同。您不必这样,但干净优雅的代码和资源管理始终是一件好事。

于 2012-09-11T09:26:02.280 回答
4

数据库连接不是无限的。尤其是商业数据库软件,通常具有将同时连接数限制为相对较少的许可证。在这种情况下,当您的脚本不再积极使用时,您肯定希望关闭连接。虽然 PHP 会在脚本终止时自动关闭数据库连接,但在访问者完成页面下载之前它不会这样做。如果他的连接速度很慢(拨号或移动),就你所知,这可能需要十到二十秒。

于 2012-09-11T10:06:28.977 回答
0

像 Doctrine 和 Propel 这样开发良好的 ORM 擅长关闭 MySQL 连接。但是,如果您使用的是直接 php,我已经看到很多数据库问题可以追溯到未关闭的连接。在每个脚本结束时关闭所有数据库连接是明智的。

于 2012-09-19T02:00:39.003 回答