Frage Postgres: "Fehler: Cache-Plan darf den Ergebnistyp nicht ändern"


Diese Ausnahme wird vom PostgreSQL 8.3.7-Server an meine Anwendung gesendet. Weiß jemand, was dieser Fehler bedeutet und was ich dagegen tun kann?

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

76
2018-05-06 19:23


Ursprung


Antworten:


Ich habe herausgefunden, was diesen Fehler verursacht hat.

Meine Anwendung hat eine Datenbankverbindung geöffnet und eine SELECT-Anweisung zur Ausführung vorbereitet.

Währenddessen änderte ein anderes Skript die Datenbanktabelle und änderte den Datentyp einer der Spalten, die in der obigen SELECT-Anweisung zurückgegeben wurden.

Ich habe dies gelöst, indem ich die Anwendung neu gestartet habe, nachdem die Datenbanktabelle geändert wurde. Dadurch wird die Datenbankverbindung zurückgesetzt, sodass die vorbereitete Anweisung ohne Fehler ausgeführt werden kann.


132
2018-05-06 20:52



Ich füge diese Antwort für jeden hinzu, der hier landet, indem er googelt ERROR: cached plan must not change result type.

Sie können dieses Problem vermeiden, indem Sie Ihre konfigurieren pgjdbc Fahrer mit autosave=conservative. Mit dieser Option sollten Sie Ihren Server nicht bouncen oder Ihren Verbindungspool oder die von Ihnen eventuell vorgeschlagene Problemumgehung leeren.

Reproduziert auf Postgres 9.6 (AWS RDS) und meine ersten Tests scheinen darauf hinzudeuten, dass das Problem mit dieser Option vollständig gelöst ist.

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

Sie können auf die pgjdbc  Github-Ausgabe 451 für weitere Details und Geschichte des Problems.

Beachten Sie, dass gemäß den angegebenen Leistungsproblemen in der obigen Verknüpfung - Sie sollten einige Performance / Load / Soak-Tests Ihrer Anwendung durchführen, bevor Sie diese blind einschalten.


3
2018-01-31 07:05