Zjistili jsme příčinu tohoto problému. Je to vysvětleno chybnou implementací setQueryTimeout() v nejnovějších ovladačích JDBC 9.2-100x. Nemusí se to stát, pokud připojení otevřete/zavřete ručně, ale velmi často se to stane, když je na místě sdružování připojení a automatické potvrzení nastaveno na false . V tomto případě by měla být funkce setQueryTimeout() volána s nenulovou hodnotou (jako příklad pomocí anotace Spring framework @Transactional( timeout =xxx ).
Ukazuje se, že kdykoli je během provádění příkazu vyvolána výjimka SQL, časovač zrušení nebyl zrušen a zůstává aktivní (tak je implementován). Kvůli sdružování není spojení za ním uzavřeno, ale je vráceno do fondu. Později, když se spustí časovač zrušení, náhodně zruší dotaz aktuálně spojený s připojením, se kterým byl tento časovač vytvořen. V tuto chvíli je to úplně jiný dotaz, který vysvětluje efekt náhodnosti.
Navrhovaným řešením je vzdát se setQueryTimeout() a místo toho použít konfiguraci PostgreSQL (statement_timeout). Neposkytuje stejnou úroveň flexibility, ale alespoň vždy funguje.