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

Django的CONN_MAX_AGE检查时机、工作机制及Postgres连接问题问询

CONN_MAX_AGE 的工作机制详解

CONN_MAX_AGE 是Django用来管理数据库连接复用时长的设置,单位是秒,全程由Django主动控制,和Postgres自身的超时机制完全独立,先给你明确这个核心逻辑。

你的两个疑问解答:

  • (1)确实是Django主动检查并处理连接生命周期:
    Django会为每个请求/线程维护一个数据库连接池,每次需要访问数据库时,会先检查池内现有连接的存活时长:

    • 如果连接使用时间未超过CONN_MAX_AGE设定值,就直接复用该连接;
    • 如果连接已超时,Django会主动关闭这个旧连接,重新创建新连接放入池中。
      另外,dyno正常重启时Django会主动关闭所有持有的连接,但如果是异常重启(比如被强制终止),可能来不及执行关闭操作。这时候CONN_MAX_AGE的作用就凸显了——它限制了每个连接的最长复用时间,就算有漏网的无效连接,也会被Django定期清理,不会一直占用Postgres的连接名额。
  • (2)和Postgres的自动超时机制无关:
    Postgres的连接超时由它自身的专属参数(比如idle_in_transaction_session_timeout、tcp_keepalives_idle等)控制,CONN_MAX_AGE是Django层面的配置,不会传递给Postgres作为连接参数。你这次问题解决,本质是Django主动定期更换连接,避免了dyno重启遗留的无效连接在Postgres侧堆积。

为啥能解决你的连接过多问题?

Heroku环境中dyno重启较为频繁,若未设置CONN_MAX_AGE,Django会长期复用老连接,一旦dyno异常挂掉,这些连接在Postgres侧会变成“半开”状态——客户端已断开,但Postgres没及时清理。设置CONN_MAX_AGE后,Django会定时替换旧连接,相当于主动清理这些“空座位”,Postgres的连接数就不会被无效连接占满了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:19:59