ฉันกำลังเพิ่มคำตอบนี้สำหรับทุกคนที่ลงจอดที่นี่โดย googling ERROR: cached plan must not change result type
เมื่อพยายามแก้ปัญหาในบริบทของแอปพลิเคชัน Java / JDBC
ฉันสามารถสร้างข้อผิดพลาดซ้ำได้อย่างน่าเชื่อถือโดยเรียกใช้การอัปเกรดสคีมา (เช่นคำสั่ง DDL) ในขณะที่แอปแบ็คเอนด์ที่ใช้ DB กำลังทำงานอยู่ หากแอปกำลังค้นหาตารางที่มีการเปลี่ยนแปลงโดยการอัปเกรดสคีมา (กล่าวคือแอปเรียกใช้การสืบค้นก่อนและหลังการอัปเกรดบนตารางที่เปลี่ยนแปลง) - โปรแกรมควบคุม 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
หมายเหตุเกี่ยวกับประสิทธิภาพ:
ตามปัญหาด้านประสิทธิภาพที่รายงานในลิงก์ด้านบนคุณควรทำการทดสอบประสิทธิภาพ / โหลด / แช่แอปพลิเคชันของคุณก่อนที่จะเปิดใช้งานแบบสุ่มสี่สุ่มห้า
ในการทดสอบประสิทธิภาพในแอปของฉันเองที่ทำงานบนPostgres 10
อินสแตนซ์AWS RDS การเปิดใช้งานการconservative
ตั้งค่าจะส่งผลให้มีการใช้งาน CPU มากขึ้นบนเซิร์ฟเวอร์ฐานข้อมูล แม้ว่าจะไม่มากนัก แต่ฉันสามารถเห็นautosave
ฟังก์ชันการทำงานที่แสดงขึ้นว่าใช้ CPU ในปริมาณที่วัดได้หลังจากที่ฉันได้ปรับแต่งแบบสอบถามทุกครั้งที่ใช้การทดสอบโหลดของฉันและเริ่มทำการทดสอบการโหลดอย่างหนัก