web-dev-qa-db-fra.com

Est-il possible de limiter le timeout sur le serveur Postgres?

J'ai défini le délai de connexion et de commande sur 10 minutes dans mon application (côté client).

Que mon application exécute une simple requête: SELECT pg_sleep(65)

Sur certains serveurs, cela fonctionne bien, mais d'autres serveurs ferment la connexion après 60 secondes.

Serait-ce une sorte de configuration de serveur PostgreSQL qui limite les délais d'attente et ignore mes paramètres client?

20
Andrzej Gis

Oui c'est possible

Il y a deux paramètres mentionnés dans les documents (idle_in_transaction_session_timeout est nouveau dans la version 9.6x)

  • statement_timeout (entier)

    Abandonnez toute instruction qui prend plus que le nombre de millisecondes spécifié, à partir du moment où la commande arrive sur le serveur à partir du client. Si log_min_error_statement est défini sur ERROR ou inférieur, l'instruction qui a expiré sera également enregistrée. Une valeur de zéro (par défaut) désactive cette option.

    La définition de statement_timeout dans postgresql.conf n'est pas recommandée car elle affecterait toutes les sessions.

  • idle_in_transaction_session_timeout (entier)

    Mettez fin à toute session avec une transaction ouverte qui a été inactive pendant plus longtemps que la durée spécifiée en millisecondes. Cela permet de libérer tous les verrous détenus par cette session et de réutiliser l'emplacement de connexion; il permet également de vider les tuples visibles uniquement pour cette transaction. Voir Section 24.1 pour plus de détails à ce sujet.

    La valeur par défaut de 0 désactive cette fonctionnalité.

Il est important de ne pas définir le statement_timeout dans postgresql.conf sauf si vous voulez vous amuser.

Voici un exemple de fonctionnement

SET statement_timeout = 10000;
SET
test=# SELECT pg_sleep(15);
ERROR:  canceling statement due to statement timeout
34
Evan Carroll

Pas hors de la boîte. Il serait cependant assez facile de compiler un serveur personnalisé qui ignorerait vos paramètres.

Mais il est beaucoup plus probable que vos connexions soient interrompues par un pare-feu ou une passerelle qui n'aime pas les connexions inactives.

Si vous avez accès au fichier journal du serveur, cela devrait donner un bon indice. Si le client dit que le serveur a fermé la connexion de manière inattendue et que le serveur a dit que le client a fermé la connexion de manière inattendue, alors c'est probablement quelque chose entre le client et le serveur qui coupe réellement la connexion.

4
jjanes