Pengecualian ini dilemparkan oleh server PostgreSQL 8.3.7 ke aplikasi saya. Adakah yang tahu apa arti kesalahan ini dan apa yang dapat saya lakukan?
ERROR: cached plan must not change result type
STATEMENT: select code,is_deprecated from country where code=$1
postgresql
Jin Kim
sumber
sumber
Jawaban:
Saya menemukan apa yang menyebabkan kesalahan ini.
Aplikasi saya membuka koneksi database dan menyiapkan pernyataan SELECT untuk dieksekusi.
Sementara itu, skrip lain sedang memodifikasi tabel database, mengubah tipe data dari salah satu kolom yang dikembalikan dalam pernyataan SELECT di atas.
Saya menyelesaikan ini dengan memulai ulang aplikasi setelah tabel database diubah. Ini mengatur ulang koneksi database, memungkinkan pernyataan yang disiapkan untuk dijalankan tanpa kesalahan.
sumber
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
. Dan semua tes bekerja seperti pesona, tetapi hanyaRepository.findById()
. Saya tidak mengubah skema dalam pengujian saya, tetapi saya menggunakan@FlywayTest
untuk menyiapkan database init pengujian untuk setiap pengujian. Jika saya menghapus@FlywayTest
anotasi, itu berfungsi dengan baik.Saya menambahkan jawaban ini untuk siapa pun yang mendarat di sini dengan googling
ERROR: cached plan must not change result type
ketika 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
pgjdbc
driver 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 10
instans AWS RDS , mengaktifkanconservative
pengaturan tersebut mengakibatkan penggunaan CPU tambahan pada server database. Namun itu tidak banyak, saya bahkan hanya bisa melihatautosave
fungsinya 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.sumber
Bagi kami, kami menghadapi masalah serupa. Aplikasi kami bekerja pada banyak skema. Setiap kali kami melakukan perubahan skema, masalah ini mulai muncul.
Menyiapkan parameter preparedThreshold = 0 di dalam parameter JDBC menonaktifkan cache pernyataan di tingkat database. Ini menyelesaikannya untuk kami.
sumber