【问题标题】:Too many connections to DB preventing some queries from executing与数据库的连接过多,导致某些查询无法执行
【发布时间】:2010-02-09 03:07:53
【问题描述】:

我的网站上的用户最近开始收到错误消息:

无法通过socket '/var/lib/mysql/mysql.sock'连接到本地MySQL服务器(2)

我知道代码中的连接字符串是正确的,因为用户能够查询从数据库中检索信息的视图页面并将用户生成的信息提交到数据库。这使我相信该错误是由于一次打开太多连接造成的。代码是php,每个php页面都有自己的mysql_open和mysql_close命令,所以我想知道一次打开的连接是否太多。我不知道这是否可能,因为在任何一天只有 20 人登录该网站。我的问题是 - 我如何知道在任何给定时间打开了多少连接,并且我可以以某种方式跟踪随机一天中打开的连接数?我对此比较陌生,我正在使用 phpmyadmin 来管理数据库。如果实际上是连接太多,那么最好的处理方法是什么?

还有其他我尚未考虑的可能原因吗?基本上,没有可预测的方法来确定是否会提交用户的数据或是否会返回错误,这至少从用户的角度来看是令人不安的。

This question 最接近我的问题,但没有提供解决我的具体问题的解决方案,因此我发布了一个新问题。

提前感谢您的想法。

【问题讨论】:

  • 您需要检查您的 MySQL 日志并了解实际情况。

标签: php mysql connection-string


【解决方案1】:

您应该确保您确实关闭了连接,或者更好的是确保您没有在单个请求上打开太多连接。如果您在页面中有包含标签,并且包含页面和包含页面都将执行 mysql_open() 您将在某一时刻同时有两个打开的连接。您应该尽量避免这种情况并重用 mysql_open() 提供的连接。确保也将其关闭:-)。

【讨论】:

  • 信不信由你,就这么简单,这就是问题所在。非常感谢。
【解决方案2】:

使用“连接池”创建连接池,这可能有助于管理您允许的连接数。 MYSQL 中还有一个命令应该告诉你有多少连接。

这是一个可能有效的命令—— 显示进程列表;

然后你会看到挥之不去的过程。每个都有一个 ID,你可以在 MySQL Monitor 中通过进程 ID 杀死它们,方法是:

kill 2309344;

希望这会有所帮助。

当您认为您已关闭连接但有来自程序员的页面时,这是一个问题....程序员只是忘记关闭他/她的连接!

【讨论】:

  • 我认为连接池是为了在请求时节省创建和打开数据库连接的时间,因为它们是事先创建的(并因此被池化)......这个想法不是限制连接,而是让交易更有效率,无需每次都打开连接。
【解决方案3】:

show status; 来自 mysql 客户端将显示统计信息。我想你特别想看看max_used_connections

【讨论】:

    【解决方案4】:

    切题评论:如果您向 Web 用户显示 mysql 错误,则可以很容易地利用您可能存在的任何安全漏洞。

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2011-04-23
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多