Я добавляю этот ответ для всех, кто попадает сюда, используя поиск в Google 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
выпуск 451 Github для получения более подробной информации и истории проблемы.
Пользователи JRuby ActiveRecords видят это: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Примечание по производительности:
Согласно сообщениям о проблемах с производительностью в приведенной выше ссылке - вам следует провести некоторое тестирование производительности / нагрузки / выдержки вашего приложения, прежде чем включать его вслепую.
При тестировании производительности моего собственного приложения, запущенного на Postgres 10
экземпляре AWS RDS , включение этого conservative
параметра действительно приводит к дополнительной загрузке ЦП на сервере базы данных. Это было не так уж и много, я мог даже увидеть, что autosave
функциональность проявляется как использование измеримого количества ЦП после того, как я настроил каждый отдельный запрос, который использовал мой нагрузочный тест, и начал сильно подталкивать нагрузочный тест.