J'ajoute cette réponse pour quiconque atterrit 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 à niveau de schéma (c'est-à-dire des instructions DDL) pendant que mon application principale qui utilisait 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 à niveau du schéma (c'est-à-dire que l'application exécutait des requêtes avant et après la mise à niveau sur une table modifiée) - le pilote postgres renverrait cette erreur car apparemment, il met en cache certains détails du schéma.
Vous pouvez éviter le problème en configurant votre pgjdbc
pilote avecautosave=conservative
. Avec cette option, le pilote pourra vider tous les détails qu'il met en cache et vous ne devriez pas avoir à faire rebondir votre serveur ou à vider votre pool de connexions ou toute autre solution de contournement que vous avez trouvée.
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 pgjdbc
numéro 451 de Github pour plus de détails et l'historique du problème.
Les utilisateurs de JRuby ActiveRecords voient ceci: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Remarque sur les performances:
Selon les problèmes de performances signalés dans le lien ci-dessus, vous devez effectuer des tests de performance / charge / trempage de votre application avant de l'activer à l'aveugle.
En effectuant des tests de performances sur ma propre application exécutée sur une Postgres 10
instance AWS RDS , l'activation du conservative
paramètre entraîne une utilisation supplémentaire du processeur sur le serveur de base de données. Ce n'était pas grand-chose cependant, je ne pouvais même voir la autosave
fonctionnalité apparaître comme utilisant une quantité mesurable de CPU après avoir réglé chaque requête que mon test de charge utilisait et commencé à pousser le test de charge dur.