1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app ::1(45035) idle
1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ? 00:00:00 postgres: postgres my_app ::1(43084) idle
J'en vois beaucoup. Nous essayons de réparer notre fuite de connexion. Mais en attendant, nous voulons définir un délai d'expiration pour ces connexions inactives, peut-être jusqu'à 5 minutes maximum.
postgresql
database-connection
user1012451
la source
la source
socketTimeout
à partir de la documentation, il ressemble à cela ferme la connexion à la base de données, entièrement. J'essaye de fermer chaque inactif, et le compteur démarre dès que la connexion est établie.<IDLE> in transaction
sessions, laisser la session en cours d'exécution mais en<IDLE>
état? En d'autres termes, terminer la transaction mais pas la session? (Vote négatif: question peu claire)idle
pour toujours, nous nous demandons si nous pourrions définir un délai d'expiration pour chaque connexion / session (honnêtement, je ne connais pas la terminologie correcte, désolé). Si une transaction prend 5 minutes pour une application Web normale, quelque chose ne va pas ...Réponses:
Il semble que vous ayez une fuite de connexion dans votre application car elle ne parvient pas à fermer les connexions groupées . Vous ne rencontrez pas de problèmes uniquement avec les
<idle> in transaction
sessions, mais avec trop de connexions en général.Tuer les connexions n'est pas la bonne réponse pour cela, mais c'est une solution de contournement temporaire OK.
Plutôt que de redémarrer PostgreSQL pour démarrer toutes les autres connexions à partir d'une base de données PostgreSQL, consultez: Comment détacher tous les autres utilisateurs d'une base de données postgres? et Comment supprimer une base de données PostgreSQL s'il y a des connexions actives? . Ce dernier montre une meilleure requête.
Pour définir les délais d'expiration, comme @Doon l'a suggéré, consultez Comment fermer automatiquement les connexions inactives dans PostgreSQL? , qui vous conseille d'utiliser PgBouncer pour proxy pour PostgreSQL et gérer les connexions inactives. C'est une très bonne idée si vous avez une application boguée qui perd de toute façon des connexions; Je recommande fortement de configurer PgBouncer.
Un keepalive TCP ne fera pas le travail ici, car l'application est toujours connectée et vivante, elle ne devrait tout simplement pas l'être.
Dans PostgreSQL 9.2 et versions ultérieures, vous pouvez utiliser la nouvelle
state_change
colonne d'horodatage et lestate
champ depg_stat_activity
pour implémenter un outil de récupération de connexion inactif. Demandez à une tâche cron d'exécuter quelque chose comme ceci:Dans les anciennes versions, vous devez implémenter des schémas complexes qui permettent de suivre le moment où la connexion est devenue inactive. Ne pas déranger; utilisez simplement pgbouncer.
la source
idle
. pourquoi devrais-je le fermer.Dans PostgreSQL 9.6, il existe une nouvelle option
idle_in_transaction_session_timeout
qui devrait accomplir ce que vous décrivez. Vous pouvez le définir à l'aide de laSET
commande, par exemple:la source
SET SESSION
est juste pour la session en cours (il reviendra à la valeur par défaut une fois que vous ouvrirez une nouvelle connexion). Vous pouvez également définir des paramètres de configuration au niveau de la base de données en utilisant, par exempleALTER DATABASE SET idle_in_transaction_session_timeout = '5min'
, ou en utilisant des fichiers de configuration (voir postgresql.org/docs/current/static/config-setting.html ).Dans PostgreSQL 9.1, les connexions inactives avec la requête suivante. Cela m'a aidé à éviter la situation qui justifiait le redémarrage de la base de données. Cela se produit principalement avec les connexions JDBC ouvertes et non fermées correctement.
la source
si vous utilisez postgresql 9.6+, vous pouvez définir dans votre postgresql.conf
idle_in_transaction_session_timeout = 30000
(msec)la source
Une solution de contournement possible qui permet d'activer le délai d'expiration de session de base de données sans tâche planifiée externe consiste à utiliser l'extension pg_timeout que j'ai développée.
la source