sql >> Database teknologi >  >> RDS >> PostgreSQL

postgresql fejl:annullerer erklæring på grund af brugeranmodning

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.



  1. Entity Data Model Wizard får undtagelse, når du forsøger at tilføje en ny Oracle-forbindelse

  2. ClassNotFoundException med Elastic Beanstalk og Tomcat 7

  3. Forsøger at få INSERT til kun at indsætte nye data

  4. Fortabt i datoer og tidszoner