【问题标题】:PHP to MySQL connection: wait until a connection is available, instead of throwing "max_user_connections exceeded" error?PHP 到 MySQL 连接:等到连接可用,而不是抛出“max_user_connections exceeded”错误?
【发布时间】:2014-06-11 05:40:10
【问题描述】:

MySQL 具有强制连接最大数量的功能,max_user_connections

当从 PHP(和other languages)连接时,如果您超过该数量,我的理解是您的连接将失败,并出现错误,说明您已超过最大连接数。对吗?

我的偏好是让连接调用等待(直到某个超时限制)以使连接可​​用。但是,我无法通过阅读 MySQL 文档和搜索网络来确定执行此操作的方法。

我担心的是,如果我们的 Web 应用程序有大量流量导致大量并发 MySQL 连接尝试,我们的一些用户脚本将以错误结束。自然地,我们可以修改调用代码以尝试重新连接到一定次数,但是如果我们可以修改连接尝试本身来处理这个问题,它会更简洁,而不是必须将每个“连接”调用包装在一个循环。此外,循环不会导致真正的 FIFO 队列,因为每个单独的调用线程会等待一小段时间然后再试一次,它是否获得连接取决于在那个特定时刻是否有可用的连接。然后它会再次等待,在等待期间,可能会打开一个连接,并且“更靠后”的另一个线程可能会抓住它。

那么,当使用任何 PHP API 连接 MySQL 时,有没有办法以“等待连接可用”的方式尝试连接?

【问题讨论】:

  • 这些年来我已经看到这个问题几十次了。我认为你的方法有缺陷。原因很可能是编程效率低下,例如查询花费的时间太长(因此优化有问题的查询或优化表索引等),或者您过于频繁地访问数据库并获取应缓存的数据.如果你真的需要更多的连接(这是非常值得怀疑的),只需创建一个新用户并拆分两个用户之间的连接。
  • 我很欣赏架构反馈,但请记住,在网络世界中,请求可以同时发生。如果你遇到十个并发请求,你的 max_user_connections 是四个,并且你只被允许一个用户(这是最低 ClearDB 层的情况,顺便说一句),那么你有六个连接太多。您的查询可能只需要 25 毫秒即可完成,但如果 10 个请求真正并发,则有 6 个请求失败。
  • 另外,这完全是假设性的。我目前没有遇到“超出最大用户连接限制”错误。我正在尝试找出避免使用的最佳策略,并且允许连接请求等待似乎是 one 策略。您提到的其他内容,例如在适当的地方缓存数据,当然是有效的,但不是我的问题。

标签: php mysql mysqlconnection cleardb


【解决方案1】:

尝试在页脚的所有 php 页面中添加以下 php 代码:

  mysql_close();

通常您的错误消息是没有关闭的 mysql 连接并保持服务器端的连接。 然而,这只是我很久以前愚蠢的编码错误。 如果关闭 mysql 连接也无法解决您的问题。 我认为您需要登录服务器来更改 php.ini 的某些设置以增加连接用户值。 希望我的回答能帮助您解决问题。

【讨论】:

  • 感谢您尝试提供答案,但我的问题与缺少 mysql_close() 调用无关。
【解决方案2】:

MySQL 没有任何功能可以执行您所描述的操作。也就是说,当您点击max_connections 时,MySQL 没有连接的 FIFO(队列)。如果无法立即连接,所有连接都会出错。

MySQL 内置的最相关的东西是配置变量back_log,它只配置未完成连接数的限制。也就是说,主 MySQL 线程需要一小段时间来检查传入的连接,这些在侦听队列中堆积,这是在套接字甚至完成之前并且在 MySQL 确定我们是否有超过 max_connections 线程之前.事实上,即使服务器当前远低于max_connections 线程,您也可以在侦听队列中获得一堆未完成的连接。

http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_back_log

另一种选择是将 HA-Proxy 添加到组合中,因为 HA-Proxy 确实具有提供队列功能。这是一个更详细地解释这一点的博客:http://flavio.tordini.org/a-more-stable-mysql-with-haproxy

坦率地说,大多数网站只是增加max_connections 直到它可以处理您的典型流量高峰,然后从那里尝试优化数据库活动,因此连接持续时间很短,因此您有很好的吞吐量。它还有助于将您的应用程序编码为尽可能晚地连接,并在完成所有查询后尽快断开连接。

如果您的流量出现超过max_connections 的非典型峰值,那么您的应用程序将收到一个错误指示。您应该对您的应用程序进行编码以优雅地处理此类错误。也就是说,尽可能好地显示一条消息,例如“抱歉,我们的负载太大,目前无法处理您的请求,请稍后再试。”这至少比突然的白屏、堆栈跟踪或其他东西要好。

【讨论】:

  • 我得研究一下 HA-Proxy,听起来很有趣。
猜你喜欢
  • 1970-01-01
  • 2018-12-18
  • 2013-06-27
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2017-08-11
  • 2019-07-25
  • 2015-07-28
相关资源
最近更新 更多