답변:
이 오류의 원인을 파악했습니다.
내 응용 프로그램은 데이터베이스 연결을 열고 실행할 SELECT 문을 준비했습니다.
한편, 다른 스크립트는 위의 SELECT 문에서 반환되는 열 중 하나의 데이터 유형을 변경하여 데이터베이스 테이블을 수정하고있었습니다.
데이터베이스 테이블이 수정 된 후 애플리케이션을 다시 시작하여이 문제를 해결했습니다. 이렇게하면 데이터베이스 연결이 재설정되어 준비된 명령문이 오류없이 실행될 수 있습니다.
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
. 그리고 모든 테스트는 매력처럼 작동하지만 Repository.findById()
. 테스트에서 스키마를 변경하지는 않지만 @FlywayTest
각 테스트에 대해 테스트 초기화 데이터베이스를 준비하는 데 사용 하고 있습니다. @FlywayTest
주석을 제거하면 잘 작동합니다.
ERROR: cached plan must not change result type
Java / JDBC 응용 프로그램의 맥락에서 문제를 해결하려고 할 때 인터넷 검색을 통해 여기에 방문하는 모든 사람을 위해이 답변을 추가 하고 있습니다.
DB를 사용하는 백엔드 앱이 실행되는 동안 스키마 업그레이드 (예 : DDL 문)를 실행하여 오류를 안정적으로 재현 할 수있었습니다. 앱이 스키마 업그레이드에 의해 변경된 테이블을 쿼리하는 경우 (즉, 앱이 변경된 테이블에서 업그레이드 전후에 쿼리를 실행 한 경우) postgres 드라이버는 일부 스키마 세부 정보를 캐싱하기 때문에이 오류를 반환합니다.
을 사용하여 pgjdbc
드라이버를 구성하면 문제를 피할 수 있습니다 autosave=conservative
. 이 옵션을 사용하면 드라이버가 캐싱중인 모든 세부 정보를 플러시 할 수 있으며 서버를 바운스하거나 연결 풀을 플러시 할 필요가 없습니다.
Postgres 9.6 (AWS RDS)에서 재현되었으며 초기 테스트에서이 옵션으로 문제가 완전히 해결 된 것으로 보입니다.
선적 서류 비치: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
당신은 볼 수 pgjdbc
Github에서 문제 451 문제의 자세한 내용과 역사.
JRuby ActiveRecords 사용자는 https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60을 참조하십시오.
성능 참고 :
위 링크에서보고 된 성능 문제에 따라 맹목적으로 켜기 전에 애플리케이션의 성능 / 부하 / 흡수 테스트를 수행해야합니다.
AWS RDS Postgres 10
인스턴스에서 실행되는 내 앱에서 성능 테스트를 수행 할 때 conservative
설정을 활성화 하면 데이터베이스 서버에서 추가 CPU 사용량이 발생합니다. 그다지 많지는 않았지만 autosave
부하 테스트에서 사용하는 모든 단일 쿼리를 조정하고 부하 테스트를 열심히 시작한 후에 측정 가능한 양의 CPU를 사용하는 것으로 기능이 나타나는 것을 볼 수있었습니다 .