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 для более подробной информации и истории вопроса.обратите внимание, что, согласно сообщенным проблемам с производительностью в приведенной выше ссылке - вы должны выполнить некоторое тестирование производительности / нагрузки / замачивания вашего приложения, прежде чем включать его вслепую.