11
votes

Jdbc postgres requête avec un délai d'attente

Malheureusement, Settimeout n'est pas implémenté pour JDBC / Postgres. Y a-t-il une façon de simuler ou de contourner cela? Fonctionnellement, je veux exécuter la requête et la pause alors si elle prend plus de plus que n secondes


1 commentaires

J'ai trouvé cette question et la réponse utile également pour un problème Python / Psycopg2 que j'ai rencontré. Psycopg2 semble avoir autorisé le réglage du délai d'attente au moment de la connexion, mais cette interface était abstraite dans mon cas. Ajout de ce commentaire pour profiter aux autres les recherches.


4 Réponses :



21
votes

Le "relevé_timeout" ressemble à ce que vous voulez.

SET statement_timeout TO 1000; -- for a second
<your_query_here>;
RESET statement_timeout; -- reset


4 commentaires

Vous ferez mieux d'utiliser réinitialiser énoncé_timeout; Une fois la requête terminée - au cas où il y a une valeur par défaut ...


Testé cela sur PGADMIN3. Seulement travaillé lorsque l'instruction SET_TIMEOUT est exécutée séparément de la requête réelle. Lorsqu'il est exécuté ensemble, PGADMIN3 utilise quelle que soit la valeur du délai d'attente déjà définie et qu'il n'utilise pas celui fourni avec la requête.


Alternativement, utilisez Définition de l'instruction locale sur 1000, ce qui limite la portée à la transaction en cours. De cette façon, vous n'avez pas à vous soucier de la réinitialiser, il vous suffit de limiter la portée de la transaction.


Pour que cela soit plus clair, je viens d'écrire ma propre réponse; N'hésitez pas à mettre à jour le vôtre.



0
votes

Et si vous deviez utiliser C3P0 pour votre DataSource? Il possède de nombreux options configurables et pour des bases de données et des réseaux courants, par exemple des acquirères, de l'acquireurRetryDelay et de BreakafteracQuireFailure.


0 commentaires

0
votes

L'utilisation du mot clé local limite la portée de la relève_timeout à la transaction en cours. De cette façon, si quelque chose ne va pas (par exemple, il est temps de sortir) Le délai d'attente est réinitialisé. XXX


0 commentaires