Django.db.utils.InterfaceError: соединение уже закрыто

Стек: Ubuntu (20.04 LTS) Nginx Postgresql (v13.3) Балансировщик нагрузки AWS отправляет трафик на экземпляр Ubuntu (кластер k8s), который обрабатывается Nginx, который перенаправляет его на Django (4.0.3), запущенный в gunicorn (19.9.0). Django подключается к базе данных с помощью psycopg2 (2.8.6). Проблема заключается в том, что соединение с базой данных, похоже, отключается случайным образом.

Django сообщает об ошибках, подобных этой:

`InterfaceError: connection already closed
  File "django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "contextlib.py", line 79, in inner
    return func(*args, **kwds)
  File "django/views/generic/base.py", line 84, in view
    return self.dispatch(request, *args, **kwargs)
  File "django/utils/decorators.py", line 46, in _wrapper
    return bound_method(*args, **kwargs)
  File "django/views/decorators/cache.py", line 62, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "django/views/generic/base.py", line 119, in dispatch
    return handler(request, *args, **kwargs)
  File "django/views/generic/detail.py", line 108, in get
    self.object = self.get_object()
  File "django/views/generic/detail.py", line 53, in get_object
    obj = queryset.get()
  File "django/db/models/query.py", line 492, in get
    num = len(clone)
  File "django/db/models/query.py", line 302, in __len__
    self._fetch_all()
  File "django/db/models/query.py", line 1507, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "django/db/models/query.py", line 57, in __iter__
    results = compiler.execute_sql(
  File "django/db/models/sql/compiler.py", line 1359, in execute_sql
    cursor = self.connection.cursor()
  File "django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "django/db/backends/base/base.py", line 284, in cursor
    return self._cursor()
  File "django/db/backends/base/base.py", line 262, in _cursor
    return self._prepare_cursor(self.create_cursor(name))
  File "django/db/utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "django/db/backends/base/base.py", line 262, in _cursor
    return self._prepare_cursor(self.create_cursor(name))
  File "django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "django/db/backends/postgresql/base.py", line 256, in create_cursor
    cursor = self.connection.cursor()`

Postgresql не сообщает о каких-либо серьезных ошибках: Я могу только предположить, что соединение было закрыто правильно, и Django не ожидал этого. Это происходит довольно редко, но достаточно, чтобы вызвать беспокойство: раз в 3 дня. Любые предложения о том, как исследовать это дальше, будут приняты с благодарностью. Заранее спасибо!

Я использую django-service-objects и Django-Q для кода распределенного анализа данных. Я столкнулся с ошибкой "django.db.utils.InterfaceError: connection already closed", когда я запускал Django-Q кластер async_task(..., sync=True) для отладки и попытался запросить Django PostgreSQL 13 DB, используя Model.object.get(pk=...).

Я решил проблему, установив db_transaction = False в классе Service.

class dataMining(Service):
    db_transaction = False

https://django-service-objects.readthedocs.io/en/stable/pages/usage.html#database-transactions

Эффект db_transaction=True (включенный по умолчанию) заключается в том, чтобы "...обрабатывать метод на сервисах ... внутри транзакции". Это означает, что изменения в БД Django PostgreSQL фактически не сохраняются до тех пор, пока метод def process(self) класса Service не завершится успешно. https://django-service-objects.readthedocs.io/en/stable/pages/usage.html#service

Я подозреваю, что вызов self.object = self.get_object() в вашем примере кода испытывает ту же проблему "блокировки" во время метода процесса в транзакции БД.

Вернуться на верх