Cette exception est lancée par le serveur PostgreSQL 8.3.7 à mon application. Quelqu'un sait-il ce que signifie cette erreur et ce que je peux y faire?
ERROR: cached plan must not change result type
STATEMENT: select code,is_deprecated from country where code=$1
postgresql
Jin Kim
la source
la source
Réponses:
J'ai compris ce qui causait cette erreur.
Mon application a ouvert une connexion à la base de données et préparé une instruction SELECT pour exécution.
Pendant ce temps, un autre script modifiait la table de la base de données, changeant le type de données de l'une des colonnes renvoyées dans l'instruction SELECT ci-dessus.
J'ai résolu ce problème en redémarrant l'application après la modification de la table de base de données. Cela réinitialise la connexion à la base de données, permettant à l'instruction préparée de s'exécuter sans erreur.
la source
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
. Et tous les tests fonctionnent comme un charme, mais seulementRepository.findById()
. Je ne change pas le schéma dans mes tests, mais j'utilise@FlywayTest
pour préparer une base de données d'initialisation de test pour chaque test. Si je supprime l'@FlywayTest
annotation, cela fonctionne bien.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 duconservative
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 laautosave
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.la source
Pour nous, nous étions confrontés à un problème similaire. Notre application fonctionne sur plusieurs schémas. Chaque fois que nous faisions des changements de schéma, ce problème commençait à se produire.
La configuration du paramètre prepareThreshold = 0 dans le paramètre JDBC désactive la mise en cache des instructions au niveau de la base de données. Cela a résolu le problème pour nous.
la source