Kami telah menemukan penyebab masalah ini. Ini dijelaskan oleh implementasi buggy dari setQueryTimeout() di driver JDBC terbaru 9.2-100x. Ini mungkin tidak terjadi jika Anda membuka/menutup koneksi secara manual, tetapi sangat sering terjadi dengan penggabungan koneksi dan autocommit disetel ke salah . Dalam hal ini, setQueryTimeout() harus dipanggil dengan nilai bukan nol (sebagai contoh, menggunakan anotasi Spring framework @Transactional( timeout =xxx ).
Ternyata, setiap kali pengecualian SQL dimunculkan selama eksekusi pernyataan, penghitung waktu pembatalan belum dibatalkan dan tetap hidup (begitulah penerapannya). Karena pooling, koneksi di belakang tidak ditutup tetapi dikembalikan ke pool. Kemudian, saat timer pembatalan dipicu, secara acak membatalkan kueri yang saat ini terkait dengan koneksi yang dibuat oleh timer ini. Saat ini, ini adalah kueri yang sama sekali berbeda yang menjelaskan efek keacakan.
Solusi yang disarankan adalah menyerah pada setQueryTimeout() dan menggunakan konfigurasi PostgreSQL sebagai gantinya (statement_timeout). Itu tidak memberikan tingkat fleksibilitas yang sama tetapi setidaknya selalu berhasil.