我在使用 PostgreSQL 作为数据库后端的 Django 应用程序中遇到“连接已关闭”错误。尽管尝试了各种解决方案,但我似乎无法解决这个问题。
背景信息 Django 版本:4.2.13 心灵感应2:2.9.9
问题陈述 我有一个 Django 应用程序,在尝试与 PostgreSQL 数据库交互时间歇性地抛出“连接已关闭”错误。此问题通常在以下情况下出现:
运行后台任务,每 30 秒将数据插入数据库
errors: File "django\utils\asyncio.py", line 26, in innerreturn func(*args, **kwargs) File "django\db\backends\base\base.py", line 330, in cursorreturn self._cursor() File "django\db\backends\base\base.py", line 308, in _cursorreturn self._prepare_cursor(self.create_cursor(name))File "django\db\utils.py", line 91, in exitraise dj_exc_value.with_traceback(traceback) from exc_valueFile "django\db\backends\base\base.py", line 308, in _cursorreturn self._prepare_cursor(self.create_cursor(name))File "django\utils\asyncio.py", line 26, in innerreturn func(*args, **kwargs)File "django\db\backends\postgresql\base.py", line 330, in create_cursorcursor =
self.connection.cursor()django.db.utils.InterfaceError: connection already closed
我尝试过的事情
尽管进行了这些尝试,问题仍然存在
CONN_HEALTH_CHECKS
仅适用于(HTTP)请求上下文。在后台任务中使用时它不会执行任何操作:
如果设置为 True,现有的持久数据库连接将在执行数据库访问的每个请求中重用之前进行运行状况检查。
这是一个已知问题。
您应该在循环中手动执行类似的检查。我们看不到您的实际代码,但它将类似于以下内容:
from django.db import close_old_connections
while True:
close_old_connections()
# ...do the things ...
time.sleep(30)