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


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

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

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

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

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