You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动Celery Worker时触发cx_Oracle错误(Django+Oracle+Redis环境)

问题分析与解决

错误原因

你遇到的ORA-03113: end-of-file on communication channel错误,本质是Celery Worker的fork子进程继承了父进程的Oracle数据库连接导致的。Celery默认使用prefork进程池,父进程启动时建立的Oracle连接会被子进程继承,但这个连接在子进程中是无效的。Django的Celery修复逻辑(DjangoWorkerFixup)在子进程初始化时尝试关闭这个无效连接,从而触发了Oracle的连接错误。

解决方案

1. 配置Celery子进程定期重启

在prod.py中添加以下配置,让子进程处理一定数量的任务后自动重启,避免无效连接累积:

# Celery 子进程每处理1个任务后重启(可根据业务压力调整数值)
CELERY_WORKER_MAX_TASKS_PER_CHILD = 1
# 限制预取任务数,减少子进程持有无效连接的时间
CELERY_WORKER_PREFETCH_MULTIPLIER = 1

2. 手动重置子进程的数据库连接

修改celery.py,通过Celery信号在子进程初始化时主动关闭继承的无效连接,让Django在需要时重新建立有效连接:

import os
from celery import Celery
from django.db import connection
from celery.signals import worker_process_init

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "raxakprotect.settings.prod")                                                 
app = Celery("raxakprotect")
app.config_from_object("django.conf:settings", namespace="CELERY")

@worker_process_init.connect
def reset_db_connection(**kwargs):
    # 关闭子进程继承的无效Oracle连接
    connection.close()

3. 验证Oracle环境兼容性

  • 确认cx_Oracle版本与Oracle客户端、Django版本适配(Python3.6对应的cx_Oracle建议使用7.x系列版本)
  • 检查Oracle服务器的连接超时设置,避免父进程的连接被服务器主动断开

内容的提问来源于stack exchange,提问作者Prasanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:47:08