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

Heroku上Sinatra应用PG连接失败:部署后运行一段时间出内部错误

解决Heroku上PostgreSQL连接超时/拒绝问题

看起来你的Mad Libs应用碰到了Heroku PostgreSQL部署后常见的“短期正常、后续崩溃”问题,这种情况大概率和连接池配置不合理、连接泄漏或者Heroku数据库连接限制有关。下面是一步步的排查和修复方案:

1. 先确认Heroku PostgreSQL的连接上限

Heroku的免费/入门级PostgreSQL计划有严格的连接数限制(比如免费的Hobby Dev计划最多20个连接)。如果应用没做好连接管理,很快就会耗尽所有可用连接,导致后续请求被拒绝。

  • 你可以用Heroku CLI命令查看当前连接使用情况:
    heroku pg:info --app your-app-name
    
    重点看Connections项,对比你当前计划的连接上限。如果数值接近或达到上限,那就是连接耗尽导致的问题。

2. 调整数据库连接池配置

从你的app.rb来看,应该是用Ruby框架(比如Sinatra)开发的,默认的连接池大小可能超过了Heroku的限制,需要手动调低:

  • 如果是Sinatra+ActiveRecord,在数据库连接配置里设置合理的池大小:
    ActiveRecord::Base.establish_connection(
      ENV['DATABASE_URL'],
      pool: ENV.fetch('DB_POOL', 5).to_i # 把池大小控制在5以内,适配免费计划
    )
    
  • 要是用Rails,修改config/database.yml的生产环境配置:
    production:
      url: <%= ENV['DATABASE_URL'] %>
      pool: <%= ENV.fetch("RAILS_MAX_THREADS", 5) %>
    
    同时要保证config/puma.rb里的线程数不超过连接池大小,避免线程竞争连接资源。

3. 排查代码中的连接泄漏问题

如果应用没有正确释放数据库连接,会导致连接被长期占用不回收,最终耗尽连接池:

  • 检查代码里有没有手动执行数据库查询后未关闭连接的情况,尤其是异常分支里的处理逻辑。
  • 对于ActiveRecord,后台任务或长时间运行的进程要手动管理连接:
    # 后台任务中使用连接后主动释放
    ActiveRecord::Base.connection_pool.with_connection do
      # 执行你的数据库操作
    end
    
    框架在Web请求周期内会自动回收连接,但后台任务需要手动处理。

4. 重启应用并实时观察日志

出现连接拒绝错误后,先重启Heroku应用释放所有占用的连接:

heroku restart --app your-app-name

然后用命令实时监控日志,观察重启后是否还会重复出现问题:

heroku logs --tail --app your-app-name

如果重启后能正常运行一段时间再崩溃,那基本可以确定是连接泄漏或池配置不合理导致的。

5. 必要时升级PostgreSQL计划

如果优化连接池和修复泄漏后,应用确实需要更多连接资源,可以考虑升级到更高等级的Heroku PostgreSQL计划(比如Hobby Basic计划支持最多100个连接)。

补充:你提到本地Ubuntu虚拟机和早期repl.it版本正常,这是因为本地或repl.it的数据库通常没有严格的连接数限制,而Heroku的共享计划有严格的资源管控,所以这个问题只会在Heroku部署后显现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:25