2010-05-06 20 views
70

Ten wyjątek jest zgłaszany przez serwer PostgreSQL 8.3.7 do mojej aplikacji. Czy ktoś wie, co oznacza ten błąd i co mogę z tym zrobić?Postgres: "BŁĄD: buforowany plan nie może zmienić typu wyniku"

ERROR: cached plan must not change result type 
STATEMENT: select code,is_deprecated from country where code=$1 
+0

Czy możesz podzielić się dokładną wersją PostreSQL? 8.3.X? –

Odpowiedz

123

Odkryłem przyczynę tego błędu.

Moja aplikacja otworzyła połączenie z bazą danych i przygotowała instrukcję SELECT do wykonania.

Tymczasem inny skrypt modyfikował tabelę bazy danych, zmieniając typ danych jednej z kolumn zwracanych w powyższej instrukcji SELECT.

Rozwiązałem to przez ponowne uruchomienie aplikacji po modyfikacji tabeli bazy danych. Spowoduje to zresetowanie połączenia z bazą danych, umożliwiając wykonanie przygotowanej instrukcji bez błędów.

+3

Mam to na PostgreSQL 9.0.4, z Ruby on Rails 3.1-pre5. Wygląda na to, że powinno to być obsługiwane automatycznie przez ActiveRecord, nie? –

+3

Tak, mam nadzieję, że ActiveRecord ostatecznie zajmie się tym. Wierzę, że wywołanie MyModel.reset_column_information naprawi wszystko w krótkim czasie, jeśli chcesz uniknąć ponownego uruchamiania. – nertzy

+0

Wciąż nie zmieniłem się dla mnie ... – alanjds

1

Dodaję tę odpowiedź dla każdego, kto ląduje tutaj, używając wyszukiwarki Google pod numerem ERROR: cached plan must not change result type.

Możesz uniknąć tego problemu, konfigurując sterownik pgjdbc za pomocą autosave=conservative. Dzięki tej opcji nie powinieneś odrzucać serwera ani przepłukiwać puli połączeń ani żadnych innych sposobów obejścia problemu.

Reprodukcja na Postgresie 9,6 (AWS RDS) i moje wstępne testy wskazują, że problem został całkowicie rozwiązany dzięki tej opcji.

Dokumentacja: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters

Można spojrzeć na pgjdbcGithub issue 451 więcej szczegółów i historii tej kwestii.

Powiązane problemy