【问题标题】:MySqli Error: Can't create more than max_prepared_stmt_count statements (current value: 16382)MySqli 错误:不能创建超过 max_prepared_stmt_count 语句(当前值:16382)
【发布时间】:2017-01-28 00:41:00
【问题描述】:

当我使用正常的准备查询时出现此错误,该查询在一台服务器上运行而在另一台服务器上不运行。

$this->PreparedQuery("UPDATE user_login SET end_time = '?' WHERE id = ?", 692233, 1);

【问题讨论】:

  • 哇。这是相当多的。你真的需要全部准备好 16k 吗?
  • @YourCommonSense - 看看我的查询,只有 2 个准备好的语句。这可能是mysql的错误。
  • 实际上只有一个准备好的语句,只有一个参数。所以我认为有一个严重的错误不是在 mysqli 中,而是在 PreparedQuery 中。所以你最好摆脱它。
  • 也许你应该发布你的数据库类和/或解释你如何/在哪里使用上面的代码
  • 你能告诉我们PreparedQuery方法的源代码和你如何使用它的一点上下文吗?

标签: php mysql mysqli


【解决方案1】:

由于问题不清楚。

我会发布一些方法来避免这个mysql错误:

  • 检查您的客户端代码,您应该在不需要后关闭准备好的stmt对象。请不要泄露资源。

  • 如果您的客户端代码使用prepared statement作为缓存,请在程序看到此错误后将其全部关闭。你也可以尝试不使用prepared statement作为缓存,只创建一个,使用它,然后删除它。

  • 使用SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST查找所有客户端代码,然后重复步骤1。

  • 你也可以暂时重启mysql服务器来解决这个问题。

【讨论】:

    【解决方案2】:

    增加:

    set global max_prepared_stmt_count = 30000;
    

    **做你该做的**

    再次减少到默认值:

    set global max_prepared_stmt_count = 16382;
    

    【讨论】:

    • 您不能从常规(非超级用户)帐户设置全局变量。因此,这个建议在实际环境中可能没有帮助。
    • 此解决方案不适用于真实环境,因为我们没有超级特权。
    【解决方案3】:

    我最近也遇到了这个问题。确保在执行后处理 PreparedQuery 或任何其他准备好的 SQL 命令。处理调用 ClosePreparedStatement。

    【讨论】:

      猜你喜欢
      • 2017-01-09
      • 2016-08-25
      • 2013-05-17
      • 2016-12-18
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多