postgresql erreur: l'annulation de la déclaration en raison de la demande de l'utilisateur
Quelles sont les causes de cette erreur dans postgresql?
org.postgresql.util.PSQLException: ERROR: canceling statement due to user request
Mon Logiciel Versions:
PostgreSQL 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2), 64-bit".
Mon driver postgresql est: postgresql-9.2-1000.jdbc4.jar
À l'aide de java version: Java 1.7
Indice: Ma base de données postgresql est sur un disque dur solid state et cette erreur se produit au hasard, et parfois pas du tout.
Ayant les mêmes problèmes sur PostgreSQL 9.2.1 (PostgreSQL 9.2.1 sur x86_64-unknown-linux-gnu, compilé par gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-bit), avec le même JDK et postgresql-9.2-1001.jdbc4.jar le pilote. La base de données est à la filature en voiture, déclaration annulations se produisent de façon aléatoire, l'application ne marche pas annuler toutes les instructions SQL et de déclaration délai d'attente est fixé à 0 (indéfini). Aucune raison / solution a été encore identifiés.
Pour info: il est toujours d'actualité pour
Pour info: il est toujours d'actualité pour
postgresql-42.2.2
pilote JDBCOriginalL'auteur Eric Leschinski | 2012-10-28
Vous devez vous connecter pour publier un commentaire.
Nous avons trouvé la cause de ce problème. C'est expliqué par buggy la mise en œuvre de setQueryTimeout() dans les derniers pilotes JDBC 9.2-100x. Il peut ne pas se produire si vous ouvrez /fermez la connexion manuellement, mais il arrive très souvent avec le regroupement de connexions en place et autocommit ensemble de faux. Dans ce cas, setQueryTimeout() doit être appelée avec une valeur non nulle (par exemple, en utilisant le framework Spring @Transactionnelle( délai d'expiration = xxx ) annotation).
Il s'avère, à chaque fois que SQL exception est levée lors de l'exécution de l'instruction, l'annulation de la minuterie n'a pas été annulé et reste en vie (c'est la façon dont il est mis en œuvre). En raison de la mise en commun, la connexion n'est pas fermée, mais est retourné à la piscine.
Plus tard, lorsque l'annulation de la minuterie déclenche, au hasard annule la requête actuellement associés avec le lien de la minuterie a été créé avec. En ce moment, c'est une tout autre question, qui explique le caractère aléatoire de l'effet.
La solution de contournement proposée est de renoncer à setQueryTimeout() et à l'utilisation configuration de PostgreSQL à la place (statement_timeout). Il ne fournit pas le même niveau de flexibilité, mais au moins, fonctionne toujours.
OriginalL'auteur reta
Cela suppose que la condition de la course bogue dans le pilote jdbc fichier jar pour postgresql est responsable de l'erreur ci-dessus. (race condition décrite ici: http://postgresql.1045698.n5.nabble.com/ERROR-canceling-query-due-to-user-request-td2077761.html)
Solution de contournement 1, actualisation de la connexion à la base de données régulièrement
Une solution de contournement est de fermer la connexion à la base de données et créer une nouvelle connexion à la base de données régulièrement. Après tous les quelques milliers de sql il suffit de fermer la connexion et de la re-créer. Ensuite, pour certaines raisons, cette erreur n'est plus jeté.
Solution 2, activer l'enregistrement
Si vous activez la journalisation du pilote JDBC niveau quand vous installez le pilote, puis, dans certaines situations, la condition de la course problème est neutralisé:
Solution 3, intercepter l'exception et de ré-initialiser la connexion
Vous pouvez également essayer d'attraper l'exception spécifique, la ré-initialisation de la connexion et essayez de nouveau la requête.
Solution de contournement 4, attendre jusqu'à ce que jdbc postgresql pot est livré avec une correction de bug
Je pense que le problème peut être associée à la vitesse de mon disque dur SSD. Si vous obtenez cette erreur, merci de poster à le reproduire régulièrement ici, il y a des devs très intéressé par l'écrasement de ce bug.
OriginalL'auteur Eric Leschinski
Si vous obtenez cette erreur, sans l'utilisation de transactions
L'utilisateur a demandé à l'état d'être annulée. La déclaration est en train de faire exactement ce qu'il est dit de faire. La question est de savoir qui a demandé cette déclaration-elle être annulée?
Regarder chaque ligne dans votre code qui prépare le SQL pour l'exécution. Vous pourriez avoir une méthode qui s'applique à la déclaration qui annule la déclaration, dans certaines circonstances, comme ceci:
Dans mon cas, ce qui s'est passé, j'ai eu définir le délai d'expiration de requête à 25 secondes, et lorsque l'insert a pris plus de temps que cela. Il a réussi à l' 'annulation de la déclaration en raison de la demande de l'utilisateur' exception.
Si vous obtenez ce message d'erreur lors de l'utilisation de transactions:
Si vous recevez cette Exception, vérifiez toutes vos code qui ne les transactions SQL.
Si vous avez une requête qui est dans une transaction et que vous oubliez de s'engager, et puis vous utilisez cette connexion pour faire quelque chose où vous fonctionner que si vous n'êtes pas dans une transaction, il pourrait y avoir un comportement indéfini qui produit cette Exception.
Assurez-vous que tout le code qui effectue une transaction est le nettoyage après lui-même. Assurez-vous que l'opération commence, le travail est fait, plus le travail est effectué, et la transaction est annulée ou commis, alors assurez-vous que la connexion est à gauche dans le
autocommit=true
état.Si c'est votre problème, alors, l'Exception n'est pas jetée où vous avez oublié de nettoyer après vous, il se passe quelque part longtemps après que vous avez omis de nettoyer après une transaction, ce qui en fait un insaisissable exception de la piste vers le bas. L'actualisation de la connexion (le fermer et d'en obtenir un nouveau) est clair.
OriginalL'auteur Eric Leschinski
En plus Eric suggestions, vous pouvez voir la déclaration annule lorsque:
pg_cancel_backend
de demander à votre session d'annuler sa commande en coursfast
d'arrêt ou de redémarrage du serveur PostgreSQLVérifier les tâches cron ou de charger les outils de gestion qui pourrait annuler les requêtes de longue durée.
OriginalL'auteur Craig Ringer