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

Heroku-Django环境下如何缩短数据库连接存活时长?

问题原因分析
  1. conn_max_age数值错误:你想要设置45秒的连接存活时长,但代码里写的是conn_max_age=450,这个参数的单位是秒,450等于7分30秒,和你的预期完全不符,这是配置未达效果的直接原因。
  2. 数据库配置冲突:django_on_heroku.settings(locals())会自动调用dj_database_url.config完成数据库配置,之后你又重新赋值DATABASES['default'],可能导致连接池初始化逻辑出现异常,进而影响conn_max_age的生效。
优化方案与最佳实践
  • 修正conn_max_age数值:将参数改为conn_max_age=45,确保闲置连接在45秒后被自动回收。
  • 避免重复配置数据库:调整配置逻辑,要么禁用django_on_heroku的自动数据库配置后手动设置:
    from .base import *
    from decouple import config
    import django_on_heroku 
    import dj_database_url
    
    # 禁用自动数据库配置,避免冲突
    django_on_heroku.settings(locals(), staticfiles=False, databases=False)
    
    # 手动配置数据库,设置连接存活时长
    DATABASES['default'] = dj_database_url.config(conn_max_age=45, ssl_require=True)
    
    要么直接在django_on_heroku的调用中传递数据库参数(适配支持该传参的版本):
    django_on_heroku.settings(locals(), staticfiles=False, conn_max_age=45, ssl_require=True)
    
  • 排查连接泄漏:检查代码中是否存在手动创建连接未释放的情况:
    • 使用from django.db import connection后未调用connection.close()
    • 异步任务、线程中使用数据库连接但未正确回收
    • 异常场景下未通过上下文管理器(如with connection.cursor())确保连接释放
  • 使用连接池库:针对Heroku常用的PostgreSQL,可引入django-db-connection-pool库,通过连接池机制高效复用连接,减少闲置连接数量。安装后只需修改数据库引擎:
    DATABASES['default']['ENGINE'] = 'django_db_connections_pool.backends.postgresql'
    
  • 监控连接状态:通过Heroku CLI执行heroku pg:ps命令,查看当前数据库连接的活跃/闲置状态,确认conn_max_age是否生效,以及是否存在异常长期闲置的连接。
  • 关于Standard0计划切换:该计划的最大连接数(100)确实比Basic计划(20)更高,但核心还是要从配置和代码层面解决连接复用与泄漏问题,避免依赖更高的连接数上限掩盖本质问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:31:12