django.db.utils.InterfaceError:连接已关闭

Mic*_*era 11 django postgresql gunicorn

堆栈:Ubuntu (20.04 LTS) Nginx Postgresql (v13.3) AWS 负载均衡器将流量发送到 Ubuntu 实例(k8s 集群),由 Nginx 处理,转发到在 Gunicorn (19.9) 中运行的 Django (4.0.3) .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()`
Run Code Online (Sandbox Code Playgroud)

Postgresql 没有报告任何重大错误:我只能假设连接已正确关闭,而 Django 没有预料到它。这种情况很少发生,但足以引起关注:每 3 天一次。任何有关如何进一步调查此问题的建议将不胜感激。提前致谢!

小智 0

我使用django-service-objectsDjango-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我通过在服务类中设置解决了这个问题。

class dataMining(Service):
    db_transaction = False
Run Code Online (Sandbox Code Playgroud)

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

(默认情况下启用)的效果db_transaction=True是“...在事务内处理服务上的方法”。这意味着对 Django PostgreSQL DB 的更改只有在def process(self)Service 类的方法成功完成后才会真正保存。https://django-service-objects.readthedocs.io/en/stable/pages/usage.html#service

我怀疑self.object = self.get_object()您的代码示例中的调用在数据库事务中的处理方法期间遇到了被“锁定”的相同问题。