PostgreSQL 可以配置为限制同时连接到数据库的数量。 Heroku 附带有连接限制的计划。 “爱好”计划有 20 个连接,而标准计划从 120 个连接开始。当我们开始开发和测试,尤其是自动化测试时,爱好计划会引发错误 PG::Error (FATAL: too many connections for role "xxxxxxx")。如果我们检查与 Heroku CLI 的连接,我们会得到
Heroku CLI
直接的解决方案是使用命令终止所有连接:
$ heroku pg:killall --app <app name>
这不是一个永久的解决方案。我们对这个网站也有同样的问题。我们尝试了互联网上提供的许多解决方案,尤其是在堆栈溢出方面。
知道如何计算所需的连接数非常重要。 Heroku 文档说...
假设您没有在应用程序代码中手动创建线程,您可以使用您的网络服务器设置来指导您需要的连接数。 Unicorn Web 服务器使用多个进程进行横向扩展,如果您没有在应用程序中打开任何新线程,每个进程将占用 1 个连接。因此,在您的独角兽配置文件中,如果您将 worker_processes 设置为 3,如下所示:
worker_processes 3
然后,您的应用将为工作人员使用 3 个连接。这意味着每个测功机将需要 3 个连接。如果您使用的是“开发”计划,则可以横向扩展至 6 个 dyno,这意味着最多 20 个活动数据库连接中的 18 个。但是,连接可能会进入错误或未知状态。
解决方案 - 限制与 PgBouncer 的连接
最简单的解决方法是限制与 PG 保镖的连接。对于许多框架,您必须禁用准备好的语句才能使用 PgBouncer。然后将 PgBouncer buildpack 添加到您的应用中。
$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-pgbouncer
输出将类似于
添加了构建包。下一个版本将使用:
- heroku/python
-
https://github.com/heroku/heroku-buildpack-pgbouncer
运行 git push heroku master 以使用这些构建包创建新版本。
现在你必须修改你的 Procfile 来启动 PgBouncer。在您的 Procfile 中,将命令 bin/start-pgbouncer-stunnel 添加到 Web 条目的开头。所以如果你的 Procfile 是
web: gunicorn .wsgi:application --worker-class gevent
将其更改为:
web: bin/start-pgbouncer-stunnel gunicorn .wsgi:application --worker-class gevent
将结果提交到 git,在暂存应用上进行测试,然后部署到生产环境。
在部署时,您会看到
OUTPUT