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

Django 4.x + ASGI部署出现数据库连接过多问题求助

解决Django 4.x + Uvicorn(ASGI)的PostgreSQL连接耗尽问题

针对你遇到的OperationalError FATAL: sorry, too many clients already错误,不需要立刻切换WSGI或降级Django,以下是可行的解决思路:

核心原因

Django 4.x在ASGI模式下,数据库连接池的管理逻辑和WSGI存在差异,加上Uvicorn的多worker+多线程并发模型,容易导致连接数超出PostgreSQL的max_connections限制(默认100),这也是问题#33497指向的核心矛盾。

具体解决办法

  • 调整数据库连接池配置
    在settings.py中明确设置连接复用时长和最大连接数:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            # 你的数据库地址、用户名等基础配置
            'CONN_MAX_AGE': 60,  # 连接最长复用时间(秒),可根据业务场景调整
            'MAX_CONNS': 20,     # 限制单个进程的最大连接数,总连接数不超过PostgreSQL的max_connections
        }
    }
    

    注意:MAX_CONNS是Django 4.2及以上版本新增参数,若使用4.0/4.1版本,可借助第三方库django-db-connection-pool实现连接池数量限制。

  • 优化Uvicorn的并发配置
    控制worker和线程的总并发数,避免超出数据库连接上限:

    uvicorn myproject.asgi:application --workers 2 --threads 4
    

    建议worker数与CPU核心数相当,总并发数(worker数 × 线程数)不超过数据库MAX_CONNS或PostgreSQL的max_connections。

  • 规范异步视图的数据库操作
    若使用异步视图,务必采用Django提供的异步数据库API(如async with connection.cursor()),避免滥用async_to_sync导致不必要的连接创建;同步视图尽量复用已有连接,减少连接创建频率。

  • 临时应急方案(不推荐长期使用)
    临时调高PostgreSQL的max_connections参数(修改postgresql.conf后重启服务),但这会增加数据库内存负载,仅作为临时过渡方案。

关于文档与版本选择

不需要强制切换到WSGI或降级至3.2版本,上述配置调整基本能解决问题。目前Django官方文档在ASGI部署的数据库连接管理部分确实缺乏详细说明,这也是社区反馈的共性问题,后续版本可能会补充相关内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:13:15