Saya menambahkan jawaban ini untuk siapa pun yang mendarat di sini dengan googling ERROR: cached plan must not change result typeketika mencoba menyelesaikan masalah dalam konteks aplikasi Java / JDBC.
Saya dapat mereproduksi kesalahan secara andal dengan menjalankan pemutakhiran skema (yaitu pernyataan DDL) sementara aplikasi back-end saya yang menggunakan DB sedang berjalan. Jika aplikasi meminta tabel yang telah diubah oleh pemutakhiran skema (yaitu aplikasi menjalankan kueri sebelum dan sesudah pemutakhiran pada tabel yang diubah) - driver postgres akan mengembalikan kesalahan ini karena tampaknya itu melakukan caching pada beberapa detail skema.
Anda dapat menghindari masalah dengan mengkonfigurasi pgjdbcdriver Anda denganautosave=conservative . Dengan opsi ini, driver akan dapat membersihkan detail apa pun yang sedang di-cache dan Anda tidak perlu memantulkan server Anda atau mengosongkan kumpulan koneksi Anda atau solusi apa pun yang mungkin Anda temukan.
Direproduksi pada Postgres 9.6 (AWS RDS) dan pengujian awal saya tampaknya menunjukkan bahwa masalah telah diselesaikan sepenuhnya dengan opsi ini.
Dokumentasi: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
Anda dapat melihat pgjdbc Github masalah 451 untuk detail lebih lanjut dan riwayat masalah tersebut.
Pengguna JRuby ActiveRecords melihat ini: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Catatan tentang kinerja:
Sesuai dengan masalah kinerja yang dilaporkan pada tautan di atas - Anda harus melakukan beberapa pengujian kinerja / beban / rendam aplikasi Anda sebelum mengaktifkannya secara membabi buta.
Saat melakukan pengujian kinerja pada aplikasi saya sendiri yang berjalan pada Postgres 10instans AWS RDS , mengaktifkan conservativepengaturan tersebut mengakibatkan penggunaan CPU tambahan pada server database. Namun itu tidak banyak, saya bahkan hanya bisa melihat autosavefungsinya muncul sebagai menggunakan jumlah CPU yang dapat diukur setelah saya menyetel setiap kueri yang digunakan uji beban saya dan mulai mendorong uji beban dengan keras.