我在Heroku的业余爱好基础计划上运行Rails应用程序,由于某种原因,每当我尝试连接到生产数据库时,我总是收到臭名昭著的“角色连接过多”错误。这意味着自动备份将继续失败,并且耙任务将由于拒绝连接而无法运行。
每次我运行heroku pg:info
时都会显示20/20连接。如果我运行heroku pg:killall
,则会终止所有连接,并显示0/20,直到我重新启动所有测功机,然后立即恢复为20/20。
我设法通过终止所有连接并重新启动服务器以触发连接泄漏来运行heroku pg:psql
。运行SELECT * FROM pg_stat_activity
会显示许多空闲的“ SELECT 1”查询,但不会显示它们来自何处。这是典型的行,仅限于application_name,client_addr,waiting,state和query:
bin/rails | 10.14.19.163 | f | idle | SELECT 1
现在想象一下,x20彼此之间开始的毫秒数。暂存应用程序未显示这些症状,并且始终保持在1/20左右的连接数。
这一切都是在从阶段到生产的相当大但普通的部署之后开始的(基本上只是添加一些新的视图,模型,控制器,预编译的资产等)。
任何帮助调试此混乱情况的人将不胜感激。
编辑:
database.yml
default: &default
adapter: postgresql
encoding: unicode
pool: 5
production:
<<: *default
url: <%= ENV['DATABASE_URL'] %>
heroku ps
说:
=== web (Hobby): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: up 2018/08/11 23:10:04 +0200 (~ 13h ago)
答案 0 :(得分:0)
这可能是由几件事引起的。其中之一可能是,如果您使用的是Puma之类的并发Web服务器,则在生产环境中部署时可能会获得那么多连接。
一种调试方法是在生产模式下启动应用程序:
rails server -e production
然后在您的数据库中检查连接数
select * from pg_stat_activity
然后检查哪个进程正在建立连接。如果问题仍然存在,请考虑使用连接池PgBouncer