4

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

从 PHP(和其他语言)连接时,如果您超过该数量,我的理解是您的连接将失败,并出现错误,说明您已超过最大连接数。正确的?

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

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

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

4

2 回答 2

2

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

MySQL 内置的最相关的东西是 config 变量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,那么您的应用程序将收到一个错误指示。您应该对您的应用程序进行编码以优雅地处理此类错误。也就是说,尽可能好地显示一条消息,例如“抱歉,我们的负载太大,目前无法处理您的请求,请稍后再试。” 这至少比突然的白屏或堆栈跟踪或其他东西要好。

于 2014-05-09T06:44:51.733 回答
-2

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

  mysql_close();

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

于 2014-05-09T06:04:57.110 回答