Postgres: "ошибка: кэшированный план не должен изменять тип результата"

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

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

2 ответов


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

мое приложение открыло соединение с базой данных и подготовило инструкцию 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#connection-parameters

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

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