Ich füge diese Antwort für jeden hinzu, der hier landet, indem er googelt, ERROR: cached plan must not change result type
wenn er versucht, das Problem im Kontext einer Java / JDBC-Anwendung zu lösen.
Ich konnte den Fehler zuverlässig reproduzieren, indem ich Schema-Upgrades (dh DDL-Anweisungen) ausführte, während meine Back-End-App, die die Datenbank verwendete, ausgeführt wurde. Wenn die App eine Tabelle abfragt, die durch das Schema-Upgrade geändert wurde (dh die App hat vor und nach dem Upgrade Abfragen für eine geänderte Tabelle ausgeführt), gibt der Postgres-Treiber diesen Fehler zurück, da anscheinend einige Schemadetails zwischengespeichert werden.
Sie können das Problem vermeiden, indem Sie Ihren pgjdbc
Treiber mit konfigurieren autosave=conservative
. Mit dieser Option kann der Treiber alle zwischengespeicherten Details löschen, und Sie sollten Ihren Server nicht bouncen oder Ihren Verbindungspool leeren müssen oder welche Problemumgehung Sie möglicherweise gefunden haben.
Wiedergabe auf Postgres 9.6 (AWS RDS) und meine ersten Tests scheinen darauf hinzudeuten, dass das Problem mit dieser Option vollständig behoben ist.
Dokumentation: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
Weitere Informationen und den Verlauf der Ausgabe finden Sie in der pgjdbc
Github-Ausgabe 451 .
JRuby ActiveRecords-Benutzer sehen dies: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Hinweis zur Leistung:
Gemäß den im obigen Link gemeldeten Leistungsproblemen sollten Sie einige Leistungs- / Lade- / Einweich-Tests Ihrer Anwendung durchführen, bevor Sie diese blind einschalten.
Wenn Sie Leistungstests für meine eigene App durchführen, die auf einer AWS RDS- Postgres 10
Instanz ausgeführt wird, führt das Aktivieren der conservative
Einstellung zu einer zusätzlichen CPU-Auslastung auf dem Datenbankserver. Es war jedoch nicht viel, ich konnte erst sehen, dass die autosave
Funktionalität eine messbare Menge an CPU verwendet, nachdem ich jede einzelne Abfrage, die mein Auslastungstest verwendete, optimiert und den Auslastungstest stark vorangetrieben hatte.