SQLSTATE [HY000] [1040]连接太多

时间:2014-06-14 23:21:42

标签: php mysql database pdo

有时当我打开我的错误日志文件时,我会看到此错误

  

[2014年6月14日19:09:55 UTC] PHP致命错误:未捕获的异常   ' PDOException'消息' SQLSTATE [HY000] [1040]太多了   连接'在/home/root/products/db.php:2

     

堆栈跟踪:/home/root/products/db.php(2):   PDO-> __构造(' mysql:host = loca ...','数据库','密码')

     

/home/root/products/by-brand.php(2):include_once(' / home / root /...&# 39;)

     在第2行的/home/root/products/db.php中抛出

{main}

     

[2014年6月14日19:15:11 UTC] PHP致命错误:未捕获异常' PDOException' with message' SQLSTATE [42000]:语法错误或访问   违规:1286未知存储引擎InnoDB in   /home/root/products/detail.php:8

     

堆栈追踪:/home/root/products/name.php(8):PDO->准备('选择*   来自p ...')

     第8行/home/root/products/name.php中抛出

{main}

我试图通过使用$db=null;关闭每个脚本来解决此问题,但它似乎无法正常工作。

我联系了服务提供商。他们说一切正常。您需要在最后检查错误。我只有几个用户。

为什么我有时会收到此错误?

我的托管是无限的:无限的磁盘空间。无限的带宽,但我仍然得到这个错误。我不知道如何解决这个问题。我希望我的网站更大,但这些错误让我感到困惑

我的db.php文件包含此代码。你能检查一下这个吗?也许这会导致问题。

db.php中

$db = new PDO('mysql:host=localhost;dbname=mobiles;charset=utf8', 'root', '**somePassword**');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

3 个答案:

答案 0 :(得分:3)

这是数据库配置的限制。如果您有权编辑数据库服务的配置文件,则可以更改max_connections值。

看看: http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

您可以尝试运行此SQL查询(请注意此值!)

SET GLOBAL max_connections = 512;

这是获取所有变量的当前值:

SHOW VARIABLES;

或(对于特定变量):

SHOW GLOBAL VARIABLES LIKE '%max_connections%'

顺便说一句,如果您不需要,请尝试将PDO object设置为null。这将关闭与数据库的连接,PHP不会等待脚本完成以关闭活动连接。 (哦,你做了,对不起,我不会编辑删除。把它作为一个注释)

答案 1 :(得分:3)

在内存不足或资源不足的情况下,首先确定根本原因

您的开发系统中是否出现此问题?或者它出现在您的生产系统中?

如果在开发系统中看到,很可能是严重的技术错误。如果在生产系统中看到,问题可能是由于系统限制(不一定是系统过载)。

大多数服务器应用程序为固定数量的传入连接分配固定数量的RAM(由于技术优势)。

与大多数其他网络服务器应用程序一样, MySQL也会分配固定数量的连接。每次客户端连接时,连接池中的插槽都会分配。每次客户端断开连接时,插槽都会标记为空闲

虽然您可以扩大预先分配的连接池,但可以通过小步骤执行此操作。您的系统管理(希望如此)明智地选择了连接池的大小。

如果连接池太大,您的应用程序 - 或整个服务器 - 可能无响应:每个计算环境只能每单位时间处理一定数量的请求。该数量取决于每个请求的平均成本/成本与请求的分配。

That said, collect system load and connection amount data over time. 
Figure out, at which situations the error message gets written.

如果您知道,可以更改MySQL的max_connections设置。

PHP和MySQL

分配$db = null可以正常为explained here

关于您的问题场景,磁盘空间和带宽很可能不相关。

通常,您可以准备一个符合singleton pattern的类,该类提供与您的数据库服务器对话的唯一接口。其他模式也可能适用。

所有其他脚本应 require_once 此classe的文件,并使用此类执行所有与数据库相关的内容。

正确实现和调用,单例类使用每个请求单个MySQL连接进行处理。

设置连接数的正确位置是my.cnf,通常位于/etc/目录中。在那里,您可以设置如下值:

[mysqld]
set-variable=max_connections=250

如果遇到问题,SHOW processlist可能会有所帮助。它提供了所有活动连接的详细信息:

enter image description here

在处理catch的顶级PDOException块中,您可以将SHOW processlist的结果保存在日志文件中以供以后分析。但请确保此类日志条目的数量在每单位时间内受到限制,以免淹没您的日志文件。

请注意,对于拥有max_connections的用户的客户端连接,MySQL允许多于SUPER privileges的连接。

您可以使用此类用户收集进程列表信息。或者 - 如果是PDOException - 您可能会在短时间内延迟应用程序并尝试再次连接,然后保存进程列表。

无限磁盘空间

无限磁盘空间不存在:由于简单的事实,所生产的HDD和SSD的数量是有限数量; - )

虽然您的提供商未设置限制,但存在技术限制 - 在您的情况下很可能不重要

实际上,还有另一个限制:编写并运行一个分配越来越多磁盘空间的应用程序。在很短的时间内,您的提供商将拒绝您的合同......

答案 2 :(得分:1)

您的连接代码没有任何问题。

共享主机上,“无限制”意味着其他用户不受资源使用限制。意味着他们可以吃掉整个游泳池,而你的消费量仍然适中。

正如评论中所说,不要使用此主机。