如何摆脱MySQL错误“准备的语句需要重新准备”

2022-08-30 18:02:01

我已经重写了我的网站php代码并添加了MySQL存储过程。

在我的本地版本中,一切正常,但是在我将我的网站上传到托管服务器后,我经常收到致命错误“准备语句需要重新准备”。

有时页面加载,有时加载失败,我看到此错误。什么?


答案 1

这是一种可能性:MySQL错误#42041

他们建议提高table_definition_cache的价值。

您可以在MySQL文档中阅读有关语句缓存的信息


答案 2

@docwhat的答案似乎不错,但在共享主机服务器上,并非每个人都可以触摸或选项。table_open_cachetable_definition_cache

由于此错误与预准备语句有关,因此我尝试通过提供以下选项来“模拟”PDO 中的错误:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, [
    PDO::ATTR_EMULATE_PREPARES => true
]);

注意:实际上这是在Laravel 5.6项目中,我在以下位置添加了该选项:config/database.php

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => true,
        ],
    ],
    (...)
],

我还没有测试模拟预准备语句对加载我的网站的持续时间的影响,但它可以防止我得到的错误。SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared

性能更新:模拟版本似乎快(模拟32.7±1.4ms,正常35.0±2.3ms,n=10,p值=0.027(双尾学生T检验)。


推荐