Postgres: «ОШИБКА: кэшированный план не должен изменять тип результата» - PullRequest
88 голосов
/ 06 мая 2010

Это исключение выдается сервером PostgreSQL 8.3.7 в мое приложение. Кто-нибудь знает, что означает эта ошибка и что я могу с этим сделать?

ERROR:  cached plan must not change result type
STATEMENT:  select code,is_deprecated from country where code=$1

Ответы [ 2 ]

156 голосов
/ 07 мая 2010

Я понял, что вызвало эту ошибку.

Мое приложение открыло соединение с базой данных и подготовило инструкцию SELECT для выполнения.

Тем временем другой скрипт модифицировал таблицу базы данных, изменив тип данных одного из столбцов, возвращаемых в приведенном выше операторе SELECT.

Я решил эту проблему, перезапустив приложение после изменения таблицы базы данных. Это сбрасывает соединение с базой данных, что позволяет подготовленному оператору выполняться без ошибок.

11 голосов
/ 31 января 2018

Я добавляю этот ответ для любого, кто приземлится здесь, прибегая к помощи ERROR: cached plan must not change result type при попытке решить проблему в контексте приложения Java / JDBC.

Мне удалось надежно воспроизвести ошибку, запустив обновления схемы (т. Е. Операторы DDL), когда мое внутреннее приложение, которое использовало БД, работало. Если приложение запрашивает таблицу, которая была изменена обновлением схемы (т. Е. Приложение выполняло запросы до и после обновления измененной таблицы), драйвер postgres вернул бы эту ошибку, потому что, очевидно, он кэширует некоторые детали схемы.

Вы можете избежать этой проблемы, настроив драйвер pgjdbc с помощью autosave=conservative. С помощью этой опции драйвер сможет сбрасывать любые данные, которые он кэширует, и вам не нужно сбрасывать нагрузку с сервера, очищать пул соединений или обходить обходные пути, которые вы, возможно, придумали.

Воспроизведено на Postgres 9.6 (AWS RDS), и мое первоначальное тестирование, похоже, указывает, что проблема полностью решена с помощью этой опции.

Документация: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters

Более подробную информацию и историю проблемы можно найти в выпуске pgjdbc Github 451 .

Примечание по производительности:

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

При тестировании производительности моего собственного приложения, работающего на экземпляре AWS RDS Postgres 10, включение параметра conservative приводит к дополнительной загрузке ЦП. Хотя это было немного, я мог видеть, что функциональность autosave показала использование измеримого количества ЦП только после того, как я настроил каждый отдельный запрос, который использовался в моем нагрузочном тесте, и начал усиленно толкать нагрузочный тест.

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