PHP mySQL - 什么时候是断开数据库连接的最佳时间?

2022-08-30 21:57:08

我使用惰性连接连接到数据库对象中的数据库。这基本上意味着在第一个查询传递给它之前,它不会调用mysql_connect(),并且随后会跳过从此以后的重新连接。

现在,我的数据库类中有一个名为“几乎调用和设置”的方法(因此该方法将知道再次连接到数据库)。这应该在每次查询后调用(作为私有函数)还是通过对象在外部调用...因为我在想类似的东西(代码只是一个例子)disconnectFromDB()mysql_close()$_connected = FALSEquery()

$students = $db->query('SELECT id FROM students');

$teachers = $db->query('SELECT id FROM teachers');

现在,如果它在每次查询后关闭,这会减慢它的速度,而不是我只是在末尾添加这行

$db->disconnectFromDB();

或者我应该在页面的最末尾包含上面的那一行吗?

两者有什么优点/缺点?在你的情況下,什麼最有效?忘记关闭mySQL连接除了性能的轻微损失之外,还有什么问题吗?

感谢您花时间回答。

谢谢!


答案 1

据我所知,除非您使用持久连接,否则您的MySQL连接将在页面执行结束时关闭。

因此,您调用 disconnect 不会添加任何内容,并且由于您执行了惰性连接,因此,如果您或其他开发人员犯了错误并在错误的时间断开连接,则可能会导致创建第二个连接。

鉴于此,我只会允许我的连接自动关闭。您的页面应该快速执行,因此保持连接这么短的时间不应该引起任何问题。


答案 2

我刚刚在PHP网站上读到了关于持久连接的评论,了解它可能会很有趣:

以下是不使用持久连接的重要原因的回顾:

  • 锁定表时,通常在连接关闭时该表处于解锁状态,但由于持久性连接不会关闭,因此您意外锁定的任何表都将保持锁定状态,解锁它们的唯一方法是等待连接超时或终止进程。事务也会出现相同的锁定问题。(见以下2002年4月23日和2003年7月12日的评论)

  • 通常,当连接关闭时,临时表会被删除,但由于持久连接不会关闭,因此临时表不是临时的。如果在完成后未显式删除临时表,则该表对于重用相同连接的新客户端将已存在。设置会话变量时也会出现同样的问题。(请参阅以下关于2004年11月19日和2006年8月7日的评论)

  • 如果PHP和MySQL位于同一服务器或本地网络上,则连接时间可以忽略不计,在这种情况下,持久连接没有任何优势。

  • Apache不能很好地处理持久连接。当它收到来自新客户端的请求时,它不会使用已经打开持久连接的可用子项之一,而是倾向于生成一个新子项,然后必须打开一个新的数据库连接。这会导致过多的进程处于休眠状态,浪费资源,并在达到最大连接时导致错误,而且它破坏了持久连接的任何好处。(见下文2004年2月3日的评论,以及 http://devzone.zend.com/node/view/id/686#fn1)

(我不是写上面文字的人)


推荐