diff --git a/backend/apps/common/prefect_django_setup.py b/backend/apps/common/prefect_django_setup.py index ba485d31..b4452663 100644 --- a/backend/apps/common/prefect_django_setup.py +++ b/backend/apps/common/prefect_django_setup.py @@ -16,6 +16,7 @@ def setup_django_for_prefect(): 1. 添加项目根目录到 Python 路径 2. 设置 DJANGO_SETTINGS_MODULE 环境变量 3. 调用 django.setup() 初始化 Django + 4. 关闭旧的数据库连接,确保使用新连接 使用方式: from apps.common.prefect_django_setup import setup_django_for_prefect @@ -36,6 +37,25 @@ def setup_django_for_prefect(): # 初始化 Django import django django.setup() + + # 关闭所有旧的数据库连接,确保 Worker 进程使用新连接 + # 解决 "server closed the connection unexpectedly" 问题 + from django.db import connections + connections.close_all() + + +def close_old_db_connections(): + """ + 关闭旧的数据库连接 + + 在长时间运行的任务中调用此函数,可以确保使用有效的数据库连接。 + 适用于: + - Flow 开始前 + - Task 开始前 + - 长时间空闲后恢复操作前 + """ + from django.db import connections + connections.close_all() # 自动执行初始化(导入即生效) diff --git a/backend/config/settings.py b/backend/config/settings.py index de1e5733..c9708ba6 100644 --- a/backend/config/settings.py +++ b/backend/config/settings.py @@ -114,15 +114,20 @@ DATABASES = { # - 60-120: 推荐值(平衡性能和资源占用) # - 300+: 适合长时间任务(减少连接重建开销) # - None: 永久连接(仅适合专用连接池,不推荐) - 'CONN_MAX_AGE': int(os.getenv('DB_CONN_MAX_AGE', '300')), # 远程数据库使用 300 秒,减少重连开销 + 'CONN_MAX_AGE': int(os.getenv('DB_CONN_MAX_AGE', '60')), # 降低到 60 秒,更快检测失效连接 + + # Django 4.1+ 连接健康检查:每次使用前验证连接是否有效 + # 解决 "server closed the connection unexpectedly" 问题 + 'CONN_HEALTH_CHECKS': True, # PostgreSQL 特定选项 - 针对远程数据库优化 'OPTIONS': { 'connect_timeout': 30, # 连接超时 30 秒(远程数据库需要更长时间) 'options': '-c statement_timeout=60000 -c idle_in_transaction_session_timeout=300000', # SQL 语句超时 60 秒,事务空闲超时 5 分钟 - 'keepalives_idle': 600, # TCP keepalive 空闲时间 10 分钟 - 'keepalives_interval': 30, # TCP keepalive 间隔 30 秒 - 'keepalives_count': 3, # TCP keepalive 重试次数 + 'keepalives': 1, # 启用 TCP keepalive + 'keepalives_idle': 30, # TCP keepalive 空闲时间 30 秒(更积极地检测断连) + 'keepalives_interval': 10, # TCP keepalive 间隔 10 秒 + 'keepalives_count': 5, # TCP keepalive 重试次数 # 性能优化参数 'sslmode': 'disable', # 禁用SSL以减少连接延迟(如果网络安全可控) 'application_name': 'xingrin_scanner', # 标识应用名称,便于监控