Tôi thêm câu trả lời này cho bất kỳ ai đến đây bằng cách sử dụng googling ERROR: cached plan must not change result type
khi cố gắng giải quyết vấn đề trong ngữ cảnh của ứng dụng Java / JDBC.
Tôi đã có thể tái tạo lỗi một cách đáng tin cậy bằng cách chạy nâng cấp giản đồ (tức là các câu lệnh DDL) trong khi ứng dụng back-end của tôi sử dụng DB đang chạy. Nếu ứng dụng đang truy vấn một bảng đã được thay đổi bởi nâng cấp giản đồ (tức là ứng dụng đã chạy các truy vấn trước và sau khi nâng cấp trên một bảng đã thay đổi) - trình điều khiển postgres sẽ trả về lỗi này vì rõ ràng nó thực hiện lưu vào bộ nhớ đệm của một số chi tiết lược đồ.
Bạn có thể tránh sự cố bằng cách định cấu hình pgjdbc
trình điều khiển của mình với autosave=conservative
. Với tùy chọn này, trình điều khiển sẽ có thể xóa bất kỳ chi tiết nào mà nó đang lưu vào bộ nhớ đệm và bạn không cần phải trả lại máy chủ hoặc xóa nhóm kết nối của bạn hoặc bất kỳ giải pháp nào mà bạn có thể đã đưa ra.
Được sao chép lại trên Postgres 9.6 (AWS RDS) và thử nghiệm ban đầu của tôi dường như cho thấy sự cố đã được giải quyết hoàn toàn với tùy chọn này.
Tài liệu: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
Bạn có thể xem pgjdbc
số 451 trên Github để biết thêm chi tiết và lịch sử của vấn đề.
Người dùng JRuby ActiveRecords thấy điều này: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Lưu ý về hiệu suất:
Theo các vấn đề về hiệu suất được báo cáo trong liên kết trên - bạn nên thực hiện một số kiểm tra hiệu suất / tải / ngâm ứng dụng của mình trước khi bật tùy chọn này một cách mù quáng.
Khi thực hiện kiểm tra hiệu suất trên ứng dụng của riêng tôi chạy trên phiên bản AWS RDS Postgres 10
, việc bật conservative
cài đặt sẽ dẫn đến việc sử dụng thêm CPU trên máy chủ cơ sở dữ liệu. Mặc dù vậy, nó không nhiều lắm, tôi thậm chí chỉ có thể thấy autosave
chức năng hiển thị như đang sử dụng một lượng CPU có thể đo được sau khi tôi đã điều chỉnh từng truy vấn đơn mà bài kiểm tra tải của tôi đang sử dụng và bắt đầu đẩy mạnh kiểm tra tải.