この問題の原因を特定しました。これは、最新のJDBCドライバー9.2-100xでのsetQueryTimeout()のバグのある実装によって説明されています。手動で接続を開いたり閉じたりした場合は発生しない可能性がありますが、接続プールが適切に配置され、自動コミットされている場合に発生することがよくあります。 falseに設定 。この場合、setQueryTimeout()はゼロ以外の値で呼び出す必要があります(例として、Springフレームワークの@Transactional(timeout =xxx)アノテーションを使用します)。
ステートメントの実行中にSQL例外が発生するたびに、キャンセルタイマーはキャンセルされず、存続します(これが実装方法です)。プーリングのため、接続ビハインドは閉じられませんが、プールに戻されます。後で、キャンセルタイマーがトリガーされると、このタイマーが作成された接続に現在関連付けられているクエリがランダムにキャンセルされます。現時点では、ランダム性の影響を説明するまったく異なるクエリです。
推奨される回避策は、setQueryTimeout()をあきらめて、代わりにPostgreSQL構成(statement_timeout)を使用することです。同じレベルの柔軟性は提供されませんが、少なくとも常に機能します。