【问题标题】:MySQL(i) "Too many connections" what to do?MySQL(i)“连接太多”怎么办?
【发布时间】:2014-07-09 13:14:25
【问题描述】:

我正在编写一个庞大的 MySQLi/PHP 应用程序,但我的数据库遇到问题,运行几个小时后似乎打开了太多连接 (250)。

我在我的网络中使用了一个非常快速的外部数据库服务器。我每秒大约处理 1000 个问题,但服务器似乎没有留下深刻印象(负载接近 0)。

在我的应用程序中,MySQLi 链接被数据库类的析构函数关闭(这似乎工作正常)。

我正在使用准备好的语句,并且还有几个守护进程运行无限 while 循环和其中的一些查询(循环被 usleep() 延迟以防止过度使用,我必须注意到 mysqli_connect() 只被调用一旦启动守护进程)。

但似乎我从来没有用stmt->close() 结束我准备好的陈述。在我的数据库中的查询统计信息下,我可以看到stmt->close() 问题的数量等于stmt->execute() 的数量。那么这可能是问题吗?例如,我什么时候必须关闭我的 stmt?我不知道在哪里可以找到这个问题的解决方案。

软件版本

CentOS 6.5 下的 PHP 5.5 和 MySQL 5.6

【问题讨论】:

  • 我在 PHP PDO 方面没有很多经验,但这可能会有所帮助:stackoverflow.com/questions/5685879/…
  • 什么平台?什么网络服务器软件?什么版本的php?
  • @oliakaoil 我不使用 PDO,我使用 PHP MySQLi。但我会阅读你的建议。
  • 问题是带有 usleep 的脚本执行多长时间。如果它们运行 30 分钟,而您一次调用它们太多,它们可以使用许多连接。另一个问题是您网站上的流量是多少,以及“连接太多”是否以某种方式与用户操作(许多用户访问您的网站)或您所谓的守护进程有关。我认为问题出在你的守护进程上——你启动它们,可能永远不会完成你之前启动的那些,所以一段时间后你达到最大连接限制
  • @OllieJones PHP 5.5 under CentOS 6.5 with MySQL 5.6

标签: php mysql mysqli


【解决方案1】:

这里有一些事情可以尝试:

首先:在您的无限循环守护进程中:在睡眠前关闭您的连接,并在醒来时再次打开它们。不要试图长时间保持数据库连接打开。客户端-服务器连接中有各种超时逻辑,当您不希望它激活时,它们可能会激活,因此会给您带来不可预知的故障。打开连接,使用它们,然后关闭它们将避免这种情况。

第二:尝试使用所谓的持久连接。在mysqli 中,您可以将p: 添加到您的主机名中来执行此操作。阅读:http://www.php.net/manual/en/mysqli.persistconns.php

第三:当你用完它们时明确地close()你准备好的语句,如果你重复使用它们,在使用它们之间reset()它们是一个很好的做法。 mysqli dtor 应该自动执行此操作,但它仍然是一个好习惯

第四:您可能希望配置 Apache 或 ngnix 服务器软件以生成更少的实例和线程。这些实例和/或线程是可串行重用的资源,Linux 的 TCP 堆栈在为它们排队连接请求方面做得很好。这应该会减少 MySQL 需要处理的连接数。

第五:您需要更改 MySQL 的配置以允许超过 250 个连接吗?如果您要将 Web 流量负载平衡到大量 Web 服务器,则可能需要这样做。

恭喜您获得大量流量!现在来点真正的乐趣。哇哈哈哈。

【讨论】:

  • 我在长轮询 ajax 调用中发现了错误。这个调用发生在我后端的每次综合浏览量中,并且没有结束时间,除非有数据要返回 :-) 所以通过我的后端,它会产生很多无休止的进程(我很愚蠢,我知道哈哈)。
  • 我根据您的回答重写了很多代码。例如:我的守护进程每 30 秒重新连接一次,因此它们不会长时间保持连接打开,我现在正在使用 stmt->close()stmt->reset()。现在问题似乎解决了。感谢您的帮助!
  • 这种事情(细节不同,一般原则相同)发生在每个扩展的网络应用程序中。一点都不傻。在学校很难教这个。
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 2017-12-27
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多