Как избавиться от ошибки MySQL «Подготовленный оператор должен быть заново подготовлен» - PullRequest
10 голосов
/ 07 декабря 2010

Я переписал php-код своего сайта и добавил хранимые процедуры MySQL.

В моей локальной версии все работает нормально, но после того, как я загрузил свой сайт на хост-сервер, я постоянно получаю фатальную ошибку «Подготовленный оператор должен быть заново подготовлен».

Иногда страница загружается, иногда происходит сбой загрузки, и я вижу эту ошибку.Что это?

ОБНОВЛЕНИЕ: Проблема исчезла после перехода на VPS сервер.Спасибо за помощь.

Ответы [ 5 ]

21 голосов
/ 07 декабря 2010

Это возможно: MySQL bug # 42041

Они предлагают увеличить значение table_definition_cache.

переподготовка в документах MySQL .

8 голосов
/ 05 апреля 2018

@ docwhat's ответ кажется приятным, но на сервере общего хостинга не всем разрешено трогать опции table_open_cache или table_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,4 мс, нормально 35,0 ± 2,3 мс, n = 10, значение p = 0,027 для двух-Хвост Стьюдента).

2 голосов
/ 21 сентября 2018

Проблема: «Необходимо подготовить подготовленный оператор»

Эта проблема обычно возникает во время вызова процедуры с использованием любого языка программирования (например, Java) или вызова процедур из серверной части.

Решение: Увеличьте размер кэша с помощью (выполняющегося) ниже сценария.

Script: set global table_definition_cache = 4000;

1 голос
/ 06 сентября 2016

Мое решение состоит в том, чтобы создать процедуру, подобную этой:

DELIMITER $$
--
-- Procedimientos
--
DROP PROCEDURE IF EXISTS `dch_content_class_content`$$

CREATE DEFINER=`renuecod`@`localhost` PROCEDURE `dch_content_class_content`(IN $classId INTEGER)
BEGIN
-- vw_content_class_contents is a VIEW (UNIONS)
  select * from vw_content_class_contents;
END$$

Я надеюсь, что это поможет кому-то

0 голосов
/ 27 октября 2016

Я получал такую ​​же ошибку в Ruby on Rails в среде общего хостинга.Возможно, это не самое безопасное решение, но отключение подготовленных операторов избавило меня от сообщения об ошибке.

Это можно сделать, добавив параметр «prepare_statements: false» в файл database.yml:

production:
  prepared_statements: false

Это кажется разумным решением, когда вы не можете контролировать параметры конфигурации на сервере MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...