najwyraźniej się nie rozłącza. Korzystanie z db.close_connection()
po zakończeniu zapytania pomogłoby. Również jeśli dobrze to rozumiem CONN_MAX_AGE
do jakiejś krótkiej wartości może pomóc. I rozważ użycie jakiegoś poolera sesji, np. pgbouncera dla połączeń django. W ten sposób, jeśli masz zbyt wiele połączeń, będzie czekać (lub ponownie wykorzystać poprzednie, w zależności od konfiguracji) zamiast przerywać wykonywanie z błędem...
aktualizacja :wyjaśnienie dlaczego to proponuję
Więc jeśli masz więcej wątków, postgres max_connections
, pojawia się wspomniany błąd. Każdy wątek może ponownie użyć połączenia, jeśli CONN_MAX_AGE nie przeszło. Twoje ustawienie to 0, więc połączenie powinno zostać zamknięte po zakończeniu zapytania, ale widzisz 100 bezczynnych połączeń. Więc się nie zamykają. Duża liczba połączeń oznacza, że nie są one również ponownie wykorzystywane (logika:gdybyś miał 100 równoległych zapytań, nie wszystkie byłyby bezczynne, a jeśli masz ich tak wiele, nie są ponownie wykorzystywane - otwierają nowe). Więc myślę, że django nie zamyka ich zgodnie z obietnicą - więc CONN_MAX_AGE ustawione na 0 nie działa w twoim kodzie. Proponuję więc użyć db.close_connection()
wymuszenie rozłączenia i ustawienie CONN_MAX_AGE na niewielką wartość może zmienić zachowanie.