突然,我的Laravel应用程序在我尝试登录时停止了工作。
似乎许多连接正在打开,但没有关闭......并且达到了一些限制。
(2/2) QueryException
SQLSTATE[42000]: Syntax error or access violation: 1461 Can't create more than max_prepared_stmt_count statements (current value: 16382) (SQL: select * from `users` where `email` = joaopaulofurtado@live.com limit 1)
答案 0 :(得分:0)
max_prepared_stmt_count设置限制可以在服务器级别的mysql中同时存在的最大预准备语句数。每次要创建一个新的预准备语句时,mysql首先检查此限制,如果mysql服务器有太多准备好的语句,则使用您看到的错误消息阻止新的语句。
您在评论中提到您正在共享托管。如果您的托管服务提供商的客户共享相同的mysql服务器,那么客户创建的所有准备的ststements都使用相同的可用预准备语句池,而mysql实例只是达到了限制。
如果此错误仍然存在,您唯一可以做的就是更改托管服务提供商或使用您自己的服务器。提供者不太可能更改设置,因为它会影响整体mysql性能,但您可以尝试询问他们是否可以增加限制或者可以停止违规应用程序。
答案 1 :(得分:0)
您必须在包含大量数据的循环中运行代码;
Laravel QueryBuilder和EloquentBuilder使用 pdo准备的语句来运行查询。 Laravel不会在单个会话中删除该语句,如果您在循环中运行代码,它将不断在内存中生成准备好的语句,直到达到 max_prepared_stmt_count 设置的限制为止。我不知道如何删除已准备好的语句,因此我使用本机sql来避免Laravel生成已准备好的语句,并且它可以工作。
$sql = '.......';
DB::getPdo()->exec($sql); // for update
$results = DB::getPdo()->query($sql)->fetchAll(); // for insert