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