El servidor PostgreSQL 8.3.7 lanza esta excepción a mi aplicación. ¿Alguien sabe qué significa este error y qué puedo hacer al respecto?
ERROR: cached plan must not change result type
STATEMENT: select code,is_deprecated from country where code=$1
postgresql
Jin Kim
fuente
fuente
Respuestas:
Descubrí qué estaba causando este error.
Mi aplicación abrió una conexión de base de datos y preparó una instrucción SELECT para su ejecución.
Mientras tanto, otro script estaba modificando la tabla de la base de datos, cambiando el tipo de datos de una de las columnas que se devuelven en la declaración SELECT anterior.
Resolví esto reiniciando la aplicación después de que se modificó la tabla de la base de datos. Esto restableció la conexión de la base de datos, permitiendo que la declaración preparada se ejecute sin errores.
fuente
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
. Y todas las pruebas funcionan como un encanto, pero soloRepository.findById()
. No cambio el esquema en mis pruebas, pero lo estoy usando@FlywayTest
para preparar una base de datos de inicio de prueba para cada prueba. Si elimino la@FlywayTest
anotación, funciona bien.Estoy agregando esta respuesta para cualquiera que aterrice aquí
ERROR: cached plan must not change result type
buscando en Google cuando intente resolver el problema en el contexto de una aplicación Java / JDBC.Pude reproducir de manera confiable el error ejecutando actualizaciones de esquema (es decir, declaraciones DDL) mientras se ejecutaba mi aplicación de back-end que usaba la base de datos. Si la aplicación consultaba una tabla que había sido modificada por la actualización del esquema (es decir, la aplicación ejecutó consultas antes y después de la actualización en una tabla modificada), el controlador de postgres devolvería este error porque aparentemente almacena en caché algunos detalles del esquema.
Puede evitar el problema configurando su
pgjdbc
controlador conautosave=conservative
. Con esta opción, el controlador podrá vaciar cualquier detalle que esté almacenando en caché y no debería tener que hacer rebotar su servidor o vaciar su grupo de conexiones o cualquier solución alternativa que se le haya ocurrido.Reproducido en Postgres 9.6 (AWS RDS) y mi prueba inicial parece indicar que el problema está completamente resuelto con esta opción.
Documentación: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
Puede consultar el
pgjdbc
número 451 de Github para obtener más detalles y el historial del problema.Los usuarios de JRuby ActiveRecords ven esto: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Nota sobre el rendimiento:
De acuerdo con los problemas de rendimiento informados en el enlace anterior, debe realizar algunas pruebas de rendimiento / carga / remojo de su aplicación antes de activarla a ciegas.
Al realizar pruebas de rendimiento en mi propia aplicación que se ejecuta en una
Postgres 10
instancia de AWS RDS , habilitar laconservative
configuración da como resultado un uso adicional de la CPU en el servidor de la base de datos. Sin embargo, no fue mucho, solo pude ver que laautosave
funcionalidad se mostraba usando una cantidad medible de CPU después de haber ajustado cada consulta que estaba usando mi prueba de carga y comencé a presionar la prueba de carga con fuerza.fuente
Para nosotros, nos enfrentábamos a un problema similar. Nuestra aplicación funciona en múltiples esquemas. Siempre que estábamos haciendo cambios de esquema, este problema comenzaba a surgir.
La configuración del parámetro prepareThreshold = 0 dentro del parámetro JDBC inhabilita el almacenamiento en caché de declaraciones a nivel de la base de datos. Esto nos solucionó.
fuente