回答:
私はこのエラーの原因を突き止めました。
アプリケーションでデータベース接続を開き、実行するSELECTステートメントを準備しました。
一方、別のスクリプトがデータベーステーブルを変更し、上記のSELECTステートメントで返される列の1つのデータ型を変更していました。
データベーステーブルが変更された後にアプリケーションを再起動することで、これを解決しました。これにより、データベース接続がリセットされ、準備されたステートメントをエラーなしで実行できます。
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
。そして、すべてのテストは魅力のように機能しますが、のみRepository.findById()
です。テストではスキーマを変更しませんが、テスト@FlywayTest
ごとにテスト初期データベースを準備するために使用しています。@FlywayTest
アノテーションを削除するとうまくいきます。
ERROR: cached plan must not change result type
Java / 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を使用しているように見えるだけでした。