Diese Ausnahme wird vom PostgreSQL 8.3.7-Server in meine Anwendung ausgelöst. 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
postgresql
Jin Kim
quelle
quelle
Antworten:
Ich habe herausgefunden, was diesen Fehler verursacht hat.
Meine Anwendung hat eine Datenbankverbindung geöffnet und eine SELECT-Anweisung zur Ausführung vorbereitet.
In der Zwischenzeit änderte ein anderes Skript die Datenbanktabelle und änderte den Datentyp einer der Spalten, die in der obigen SELECT-Anweisung zurückgegeben wurden.
Ich habe dieses Problem behoben, indem ich die Anwendung neu gestartet habe, nachdem die Datenbanktabelle geändert wurde. Dadurch wird die Datenbankverbindung zurückgesetzt, sodass die vorbereitete Anweisung fehlerfrei ausgeführt werden kann.
quelle
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
. Und alle Tests funktionieren wie ein Zauber, aber nurRepository.findById()
. Ich ändere das Schema in meinen Tests nicht, aber ich@FlywayTest
bereite für jeden Test eine Testinitialdatenbank vor. Wenn ich@FlywayTest
Anmerkungen entferne , funktioniert es gut.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 konfigurierenautosave=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 derconservative
Einstellung zu einer zusätzlichen CPU-Auslastung auf dem Datenbankserver. Es war jedoch nicht viel, ich konnte erst sehen, dass dieautosave
Funktionalität eine messbare Menge an CPU verwendet, nachdem ich jede einzelne Abfrage, die mein Auslastungstest verwendete, optimiert und den Auslastungstest stark vorangetrieben hatte.quelle
Für uns standen wir vor einem ähnlichen Problem. Unsere Anwendung arbeitet mit mehreren Schemata. Wann immer wir Schemaänderungen vornahmen, trat dieses Problem auf.
Durch das Einrichten des Parameters prepareThreshold = 0 im JDBC-Parameter wird das Zwischenspeichern von Anweisungen auf Datenbankebene deaktiviert. Das hat es für uns gelöst.
quelle