Django CONN_MAX_AGE установлен в 0, но соединение остается открытым после выполнения запроса - PullRequest
1 голос
/ 27 июня 2019

Я использую Django 1.10 в качестве ORM для подключения к базе данных Postgres.У меня проблема, когда старые соединения остаются открытыми в состоянии idle в БД.

Мой запрос:

MyTable.objects.all().first().id

Я использую следующий запрос, чтобы убедиться, что соединение остается открытым:

SELECT * 
FROM pg_catalog.pg_stat_activity  
WHERE usename = 'my_user_name'
ORDER BY backend_start DESC limit 3;

Результат: enter image description here

Это исчезает, только когда я закрываю ipython или добавляю django.db.connection.close() к своему коду.

Согласно документации Django's, если для MAX_CONN_AGE установлено значение по умолчанию (0), соединение должно закрываться после окончания запроса, но не закрывается, как ожидалось.

1 Ответ

2 голосов
/ 27 июня 2019

Это действительно сбивает с толку, но «после окончания запроса» в документации означает HTTP-запрос, а не запрос к базе данных.Поскольку в сеансе ipython нет HTTP-запросов, соединение остается бездействующим.См. https://docs.djangoproject.com/en/2.2/ref/signals/#module-django.core.signals

Вот место, где зарегистрированы обработчики закрытия соединения: https://github.com/django/django/blob/21ff23bfeb4014bceaa3df27677fb68409c0634d/django/db/init.py#L60

Если вы хотите закрыть соединение после каждого запроса к базе данных, вы должны либо найти компромиссы с некоторымидругой сигнал (post_save, например) или сделать это вручную - через декоратор, через настроенный набор запросов, через пользовательский сигнал или вручную позвонив close_if_unusable_or_obsolete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...