【发布时间】: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