web-dev-qa-db-fra.com

L'application cliente se déconnecte des bases de données auxquelles elle est connectée après 10 minutes d'inactivité

Lorsque vous travaillez avec pgAdmin 4 (et en fait, plusieurs autres programmes qui agissent en tant que clients de la base de données), la connexion au serveur se déconnecte après environ 10 ou 15 minutes d'inactivité. Un café et un appel téléphonique, et vous obtenez un message similaire à "Désolé, la connexion à la base de données est perdue. Voulez-vous que je tente de me reconnecter?"

Et pgAdmin se reconnecte a toujours besoin de plus d'un essai, et l'arborescence d'objets qui a déjà été développée est réduite ... Donc, c'est un peu ennuyeux.

pgAdmin ne semble pas avoir de paramètre lié à ce comportement. (Il semble qu'il existe des moyens de modifier certains délais d'attente de connexion , mais ils sont liés au comportement de pgAdmin en ce qui concerne le serveur prenant trop de temps pour se connecter).

Que faire pour éviter que pgAdmin ne se déconnecte de la base de données?


Divulgation: Il s'agit en fait d'une "pseudo-question". C'est spin-off d'un autre , qui a fini par ne pas être lié à une perte de connectivité ... Étant donné le fait J'avais déjà une réponse en place, je pense (pas très humblement) que cela vaut la peine de "demander", au cas où la réponse serait utile à quelqu'un.

4
joanolo

pgAdmin continue de lancer un délai de connexion toutes les 10 minutes environ.

Je pense que le problème pourrait être lié à un routeur (ou, dans certains cas, un pare-feu avec état) entre = votre client pgAdmin et le serveur PostgreSQL.

Ceci est assez courant lorsque vous êtes à la maison (ou au bureau) et que votre routeur exécute NAT ( Traduction d'adresse résea ). Après un certain temps d'inactivité, la connexion est fermé par le routeur. Ce n'est pas quelque chose qui n'est fait ni par pgAdmin ni par PostgreSQL, c'est quelque chose qui dépend des paramètres du routeur,

Si tel est le cas, vous avez trois options:

  1. Modifiez le paramètre connection_timeout dans votre routeur , si cela est possible et que vous avoir la documentation appropriée. Voici un exemple pour les routeurs Cisco.

  2. Faites croire au routeur que la connexion n'est jamais inactive assez longtemps. Pour ce faire: changez un paramètre - serveur, appelé tcp_keep_alives:

Selon la documentation PostgreSQL sur les connexions :

tcp_keepalives_idle (entier)

Spécifie le nombre de secondes d'inactivité après lequel TCP doit envoyer un message keepalive au client. Une valeur de 0 utilise la valeur par défaut du système. Ce paramètre est pris en charge uniquement sur les systèmes qui prennent en charge TCP_KEEPIDLE ou TCP_KEEPALIVE sous Windows et sur les autres systèmes, il doit être égal à zéro. Dans les sessions connectées via un socket de domaine Unix, ce paramètre est ignoré et se lit toujours à zéro.

Le message keepalive devrait éviter le NAT abandonné.

Gardez à l'esprit la remarque dans la documentation:

Ce paramètre est pris en charge uniquement sur les systèmes qui prennent en charge les symboles TCP_KEEPIDLE ou TCP_KEEPALIVE et sur Windows

Je ne sais vraiment pas quels systèmes "prennent en charge les symboles TCP_KEEPIDLE ou TCP_KEEPALIVE", mais je suppose que Linux et Mac devraient les prennent en charge, tout comme Windows selon la documentation.

Si votre système se déconnecte toutes les 10 minutes, il devrait être prudent d'avoir ce paramètre à environ 9 * 60 = 540 secondes, ou moins.

Ce paramètre doit être effectué dans le postgresql.conf sur votre serveur. Vous pouvez également tester avant d'effectuer la modification sur le serveur, soit en utilisant les commandes:

SET tcp_keepalives_idle = 480 ;

ce qui modifierait le paramètre de votre connexion actuelle, ou

ALTER ROLE (the-one-you-use) tcp_keepalives_idle = 480 ;

ce qui ne modifierait le réglage que pour ce rôle.

  1. Modifiez les keep_alives sur le client. Vous n'avez pas besoin de changer tout connection_timeout (ce paramètre est "combien de temps attendre une connexion avant de décider que l'autre côté ne répond pas). Suivez les instructions de la réponse acceptée de N'importe quel moyen de maintenir la connexion vivante dans pgAdmin sans le mettre sur le serveur? C'est parfaitement expliqué.

Référence à propos de Keep-Alives: This la vidéo parle de comment garder vos sessions SSH en vie . Bien que ce ne soit pas exactement le même scénario, il est équivalent (remplacer SSH par pgAdmin).

4
joanolo