[postgresql] Postgres : “오류 : 캐시 된 계획은 결과 유형을 변경하면 안됩니다.”

이 예외는 PostgreSQL 8.3.7 서버에서 내 응용 프로그램에 throw됩니다. 누구든지이 오류가 무엇을 의미하고 내가 그것에 대해 무엇을 할 수 있는지 알고 있습니까?

ERROR:  cached plan must not change result type
STATEMENT:  select code,is_deprecated from country where code=$1



답변

이 오류의 원인을 파악했습니다.

내 응용 프로그램은 데이터베이스 연결을 열고 실행할 SELECT 문을 준비했습니다.

한편, 다른 스크립트는 위의 SELECT 문에서 반환되는 열 중 하나의 데이터 유형을 변경하여 데이터베이스 테이블을 수정하고있었습니다.

데이터베이스 테이블이 수정 된 후 애플리케이션을 다시 시작하여이 문제를 해결했습니다. 이렇게하면 데이터베이스 연결이 재설정되어 준비된 명령문이 오류없이 실행될 수 있습니다.


답변

ERROR: cached plan must not change result typeJava / 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를 사용하는 것으로 기능이 나타나는 것을 볼 수있었습니다 .


답변

우리에게도 비슷한 문제가있었습니다. 우리의 응용 프로그램은 여러 스키마에서 작동합니다. 스키마를 변경할 때마다이 문제가 발생하기 시작했습니다.

JDBC 매개 변수 내에서 prepareThreshold = 0 매개 변수를 설정 하면 데이터베이스 수준에서 명령문 캐싱이 비활성화됩니다. 이것은 우리를 위해 그것을 해결했습니다.


답변