sql >> Databáze >  >> RDS >> PostgreSQL

chyba postgresql:zrušení příkazu kvůli požadavku uživatele

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.



  1. Jak aktualizovat sloupec identity na serveru SQL?

  2. Obsah odpovědi musí být řetězec nebo objekt implementující __toString(), booleovský daný po přesunutí do psql

  3. Vypište všechny sloupce SQL s maximální délkou A největší délkou

  4. Vyberte uživatele, kteří patří pouze do určitých oddělení