Это исключение создается сервером PostgreSQL 8.3.7 моему приложению. Кто-нибудь знает, что означает эта ошибка и что я могу с этим сделать?
ERROR: cached plan must not change result type
STATEMENT: select code,is_deprecated from country where code=$1
postgresql
Джин Ким
источник
источник
Ответы:
Я понял, что вызвало эту ошибку.
Мое приложение открыло соединение с базой данных и подготовило оператор SELECT для выполнения.
Тем временем другой сценарий изменял таблицу базы данных, изменяя тип данных одного из столбцов, возвращаемых в приведенном выше операторе SELECT.
Я решил эту проблему, перезапустив приложение после изменения таблицы базы данных. Это сбрасывает соединение с базой данных, позволяя подготовленному оператору выполняться без ошибок.
источник
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
. И все тесты работают как шарм, но толькоRepository.findById()
. Я не меняю схему в своих тестах, но я использую@FlywayTest
для подготовки базы данных инициализации теста для каждого теста. Если я удалю@FlywayTest
аннотацию, все будет хорошо.Я добавляю этот ответ для всех, кто попадает сюда, используя поиск в 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
функциональность проявляется как использование измеримого количества ЦП после того, как я настроил каждый отдельный запрос, который использовал мой нагрузочный тест, и начал сильно подталкивать нагрузочный тест.источник
Для нас мы столкнулись с аналогичной проблемой. Наше приложение работает с несколькими схемами. Эта проблема возникала всякий раз, когда мы вносили изменения в схему.
Установка параметра prepareThreshold = 0 внутри параметра JDBC отключает кеширование операторов на уровне базы данных. Это решило проблему для нас.
источник