PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Django ORM laisse les connexions inactives sur Postgres DB

apparemment vous ne vous déconnectez pas. Utilisation de db.close_connection() après la fin de la requête aiderait. Aussi, si je comprends bien CONN_MAX_AGE à une valeur courte pourrait aider. Et pensez à utiliser un pooler de sessions, par exemple pgbouncer pour les connexions Django. De cette façon, si vous avez trop de connexions, il attendra (ou réutilisera le précédent, selon la configuration) au lieu d'abandonner l'exécution avec une erreur...

mettre à jour :explication pourquoi je le propose

à partir de la documentation

Donc, si vous avez plus de threads, postgres max_connections , vous obtenez une erreur mentionnée. Chaque thread peut réutiliser la connexion si CONN_MAX_AGE n'est pas passé. Votre paramètre est 0, donc la connexion doit être fermée après l'achèvement de la requête, mais vous voyez 100 connexions inactives. Ils ne ferment donc pas. Le grand nombre de connexion signifie qu'elles ne sont pas non plus réutilisées (logique :si vous aviez 100 requêtes parallèles elles ne seraient pas toutes inactives, et si vous en avez autant, elles ne sont pas réutilisées - ouverture de nouvelles). Je pense donc que Django ne les ferme pas comme promis - donc CONN_MAX_AGE défini sur 0 ne fonctionne pas dans votre code. Je propose donc d'utiliser db.close_connection() pour forcer la déconnexion et définir CONN_MAX_AGE sur une petite valeur peut modifier le comportement.