Vi har tagit reda på orsaken till detta problem. Det förklaras av buggy implementering av setQueryTimeout() i senaste JDBC-drivrutinerna 9.2-100x. Det kanske inte händer om du öppnar/stänger anslutningen manuellt, men det händer ofta med anslutningspoolning på plats och autocommit inställd på false . I det här fallet ska setQueryTimeout() anropas med ett värde som inte är noll (som ett exempel, med hjälp av Spring framework @Transactional( timeout =xxx ) annotering).
Det visar sig, närhelst SQL-undantag uppstår under satsexekveringen, har avbrytningstimern inte avbrutits och förblir vid liv (det är så det implementeras). På grund av pooling stängs inte anslutningen bakom utan återförs till poolen. Senare, när avbrytningstimern utlöses, avbryter den slumpmässigt frågan som för närvarande är kopplad till anslutningen som denna timer har skapats med. För närvarande är det en helt annan fråga som förklarar slumpeffekten.
Den föreslagna lösningen är att ge upp setQueryTimeout() och använda PostgreSQL-konfiguration istället (statement_timeout). Det ger inte samma nivå av flexibilitet men fungerar åtminstone alltid.