Postgres: "ОШИБКА: кэшированный план не должен изменять тип результата"

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

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

6 ответов

Решение

Я выяснил, что было причиной этой ошибки.

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

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

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

Я добавляю этот ответ для любого, кто приземлится здесь, прибегая к помощи ERROR: cached plan must not change result type,

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

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

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

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

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

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

Установка параметра prepareThreshold=0 внутри параметра JDBC отключает кеширование операторов на уровне базы данных. Это решило проблему для нас.

Я получил эту ошибку, я вручную выполнил неудачный запрос выбора и исправил ошибку.

Я получил эту ошибку при разработке plpgsql (удаление и создание функции) в моей локальной базе данных без других подключений.

Я думаю, что причина в том, что я использовал параметр OUT функции с тем же именем, что и столбец в таблице внутри LOOP.

Мне нужно отключиться и снова подключиться, чтобы исправить.

ПостгреСБЛ 16.

Если у вас есть приложение JPA с спящим режимом или другим поставщиком и вы меняете тип столбца в домене, например увеличиваете длину столбца одного атрибута, вам придется вручную изменить столбец в базе данных, чтобы отразить это изменение:

      alter table table_name alter column column_name type character varying(2000);
Другие вопросы по тегам