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

迁移至Django 4.2后持久连接异常,如何恢复旧版本行为?

Django 4.2.5 恢复Oracle持久连接(CONN_MAX_AGE)正常工作的方案
  • 检查Oracle数据库驱动版本
    Django 4.2对数据库驱动兼容性有更新,确认当前使用的cx-Oracle或oracledb版本适配:

    • 执行pip list | grep -E "(cx-Oracle|oracledb)"查看版本,确保cx-Oracle≥8.3,oracledb≥1.0;
    • 若之前用cx-Oracle,可尝试切换为官方推荐的oracledb,适配性更优。
  • 验证CONN_MAX_AGE配置与代码逻辑

    • 确认settings.py中CONN_MAX_AGE = 20是全局配置,未被数据库路由或视图代码覆盖;
    • 排查是否有代码手动调用connection.close()强制断开连接,这会破坏持久连接复用;
    • 可添加调试代码验证连接复用情况:
      from django.db import connection
      from django.http import HttpResponse
      
      def test_conn_reuse(request):
          print(f"当前连接ID: {connection.connection_id}, 连接时长: {connection.age}")
          return HttpResponse("连接复用测试")
      
  • 核对Oracle数据库会话超时设置
    若Oracle的SESSION_TIMEOUT小于CONN_MAX_AGE,数据库会主动关闭连接,导致Django每次新建会话:

    • 执行SQL查询参数:
      SELECT value FROM v$parameter WHERE name = 'session_timeout';
      
    • 确保SESSION_TIMEOUT(单位秒)≥20,与Django配置匹配。
  • 启用Django连接健康检查
    在settings.py中添加配置:

    CONN_HEALTH_CHECKS = True
    

    该配置是Django 4.2新增功能,会在复用连接前检查有效性,避免因数据库主动断开连接而被迫新建会话。

  • 检查WSGI/ASGI服务器配置

    • 若用Gunicorn、uWSGI等,确认--max-requests参数未设置过小,频繁重启worker会销毁连接池;
    • 异步服务器(如Daphne)需确保使用适配的异步数据库驱动,避免连接管理逻辑冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:30:03