我总是假设关闭数据库连接始终是一个好习惯,无论数据库/ ORM如何,如mysql_close(),Propel :: close()等。
参考我的其他question和其他一些关于互联网的研究,我开始知道一个令人惊讶的面孔,大多数人建议如果你关闭连接并不重要,因为连接总是在关闭之后关闭请求。
然而,我发现这些答案很难消化。原因是,为什么所有DB lib,ORM都提供close方法?如果它存在,在每个ORM / lib 中,必须有一些很好的使用它。
有人可以说明在什么情况下,我们应该用close方法关闭数据库连接? &安培;如果这些方法根本没用,为什么它们存在于所有db libs / ORM中?
修改
我的结论
这是Bondye和Fluffeh之间的一次很好的讨论,它清除了我对使用连接关闭的疑虑。感谢他们两人。
我真的很难接受一个答案,因为答案都是正确的。只需接受所有评论的回答,以便保持最佳状态。但是+1都是正确答案。
答案 0 :(得分:7)
通常不需要使用mysql_close()
,因为非持久性开放链接会在脚本执行结束时自动关闭。
释放资源
由于PHP 4的Zend引擎引入了引用计数系统,因此可以自动检测到没有更多引用的资源,并且它被垃圾收集器释放。因此,很少需要手动释放内存。
希望这对你有所帮助。
(source)
修改强>
mysql_close()
的目的也是为了节省计算机资源,但使用它的另一个关键原因是MySQL服务器可以接受的连接数量有限,并且如果有多个客户端保持连接打开无缘无故,服务器可能需要拒绝其他等待的客户端。当然这是一件坏事,因此,与mysql_free_result()
一样,如果您认为在上次使用数据库和脚本结束之间会有一段时间,最好调用mysql_close()
。
答案 1 :(得分:6)
当您不再需要数据库连接时,最好关闭它。即使它在脚本结束后自动关闭 - 可能是另一秒或一段时间后分秒。如果你不再需要它,一个用户点击一个页面并浪费数据库连接半秒也不会产生任何影响 - 但是二十个用户一次突然开启10秒连接 - 而确实有所作为。
同时,重新使用连接可能是一个很好的做法 - 制作和打开连接通常需要至少几毫秒 - 如果你要插入几十万行,那么每次几毫秒加起来非常快。
在某种程度上,将变量设置为NULL或取消设置也没有什么不同。你不有来做,但干净优雅的代码和资源管理总是是一件好事。
答案 2 :(得分:4)
数据库连接不是无限制的。特别是商业数据库软件通常具有许可证,其将同时连接的数量限制为相对较小的数量。在这种情况下,您肯定希望在脚本不再使用时关闭连接。虽然PHP会在脚本终止时自动关闭数据库连接,但在访问者下载页面之前不会这样做。如果他的连接速度很慢(拨号或移动),那么你可能需要花费10秒,20秒。
答案 3 :(得分:0)
开发良好的ORM就像Doctrine和Propel一样擅长关闭MySQL连接。但是,如果你使用直接的PHP,我已经看到很多数据库问题被追溯到未关闭的连接。在每个脚本的末尾关闭所有数据库连接是明智的。