Je rajoute cette réponse pour toute personne arrivant ici en recherchant sur Google ERROR: cached plan must not change result type
en essayant de résoudre le problème dans le contexte d'une application Java / JDBC.
J'ai pu reproduire l'erreur de manière fiable en exécutant des mises à jour de schéma (c'est-à-dire des instructions DDL) pendant que mon application back-end utilisant la base de données était en cours d'exécution. Si l'application interrogeait une table qui avait été modifiée par la mise à jour de schéma (c'est-à-dire que l'application exécutait des requêtes avant et après la mise à jour sur une table modifiée) - le pilote postgres retournerait cette erreur car apparemment il effectue un caching de certains détails du schéma.
Vous pouvez éviter le problème en configurant votre pilote pgjdbc
avec autosave=conservative
. Avec cette option, le pilote sera en mesure de vider les détails qu'il met en cache et vous ne devriez pas avoir à redémarrer votre serveur ou à vider votre pool de connexions ou toute autre solution de contournement que vous auriez pu trouver.
Reproduit sur Postgres 9.6 (AWS RDS) et mes premiers tests semblent indiquer que le problème est complètement résolu avec cette option.
Documentation : https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
Vous pouvez consulter le problème Github 451 de pgjdbc
pour plus de détails et l'historique du problème : https://github.com/pgjdbc/pgjdbc/pull/451
Les utilisateurs de JRuby ActiveRecords peuvent consulter ceci : https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Remarque sur les performances :
Comme indiqué dans les problèmes de performances rapportés dans le lien ci-dessus, vous devriez effectuer des tests de performances / de charge / d'endurance de votre application avant d'activer cela aveuglément.
En effectuant des tests de performances sur ma propre application fonctionnant sur une instance AWS RDS Postgres 10
, activer le paramètre conservative
entraîne une augmentation de l'utilisation du CPU sur le serveur de base de données. Ce n'était pas grand-chose cependant, je ne pouvais même voir la fonctionnalité autosave
utiliser une quantité mesurable de CPU qu'après avoir optimisé chaque requête que mon test de charge utilisait et commencé à pousser fort le test de charge.
0 votes
Pouvez-vous s'il vous plaît partager la version exacte de PostreSQL? 8.3.X?