Vi har fundet ud af årsagen til dette problem. Det forklares ved buggy implementering af setQueryTimeout() i seneste JDBC-drivere 9.2-100x. Det sker muligvis ikke, hvis du åbner/lukker forbindelse manuelt, men det sker meget ofte med forbindelsespooling på plads og autocommit indstillet til falsk . I dette tilfælde skal setQueryTimeout() kaldes med en værdi, der ikke er nul (som et eksempel ved hjælp af Spring framework @Transactional( timeout =xxx ) annotation).
Det viser sig, at når der rejses SQL-undtagelse under udførelse af sætningen, er annulleringstimeren ikke blevet annulleret og forbliver i live (det er sådan den implementeres). På grund af pooling lukkes bagvedliggende forbindelse ikke, men returneres til poolen. Senere, når annulleringstimeren udløses, annullerer den tilfældigt den forespørgsel, der i øjeblikket er knyttet til forbindelsen, som denne timer er blevet oprettet med. I øjeblikket er det en helt anden forespørgsel, der forklarer tilfældighedseffekten.
Den foreslåede løsning er at give op på setQueryTimeout() og bruge PostgreSQL-konfiguration i stedet (statement_timeout). Det giver ikke samme grad af fleksibilitet, men virker i det mindste altid.