ruby-on-rails - Heroku:为什么有这么多数据库连接?

标签 ruby-on-rails database postgresql heroku puma

我正在开发一个 Rails 项目,作为 iPhone 应用程序的服务器和后端数据库。在我尝试进行负载测试时,我开始收到错误消息,说有太多 db:connections,当我检查 pg:info 时,我发现这是真的(连接数:160/120)。

这在测试期间对我来说有些意义,但在测试结束后它仍然显示许多打开的连接,这让我很困惑。我的问题

1) 为什么这些数据库连接在进程运行完成后仍保持打开状态?

2) 是不是我的配置中的某些东西导致了这个?

rails: 4.2.4
Postgres: 9.4.4
Heroku dynos: five 1x-dynos
Web Server: Puma
Puma Workers: 2
Puma Threads: 9
Database Pool: ENV["DB_POOL"] || ENV['MAX_THREADS'] || 6 (so probably also 9 as MAX_THREADS is set to that)

3) 有什么方法可以将连接设置为在进程运行完成后关闭?

这是我第一次尝试设计可扩展的东西,如果这是最基本的,我很抱歉,如果有什么我忘记包括的,请告诉我。

美洲狮.rb

 workers Integer(ENV['WEB_CONCURRENCY'] || 2)
 threads_count = Integer(ENV['MAX_THREADS'] || 6)
 threads threads_count, threads_count

 preload_app!

 rackup      DefaultRackup
 port        ENV['PORT']     || 3000
 environment ENV['RACK_ENV'] || 'development

 on_worker_boot do
   # Worker specific setup for Rails 4.1+
   # See: https://devcenter.heroku.com/articles/deploying-rail-applications-with-the-puma-web-server#on-worker-boot
   ActiveRecord::Base.establish_connection
 end

最佳答案

在寻找了一段时间并尝试了几件事之后(减少 heroku dynos/puma workers/threads,启用 rails 'reaper' 等),最终解决我的问题的是 PgBouncer .

不太确定是什么导致了潜在的问题,但看起来 ActiveRecord/Postgres 正在保持连接打开以供将来使用(预期行为)。然而,当一个新进程开始运行并请求连接到数据库时,AR/PG 将创建一个新连接而不是重用旧连接(意外行为)。我可能是错的,但在我看来就是这样,PgBouncer 似乎已经解决了这个问题。希望这可以帮助其他遇到同样问题的人。

关于ruby-on-rails - Heroku:为什么有这么多数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35301152/

相关文章:

sql - 如何在内部查询列中使用外部查询列

postgresql - 尝试创建数据库时出错 - Ecto - Phoenix

javascript - 通过 AWS Ruby SDK 将 Base64 图像数据上传到 S3

ruby-on-rails - Rails 4 - 在生产服务器上预编译 Assets 后没有 manifest.json

ruby-on-rails - Ruby on Rails 中的关注点是否可以替代 MVC 中的服务类?

php - 创建数据库中某个字段的所有数据的字符串 - PHP

mysql - 是否可以查看数据库索引的底层树?

ruby-on-rails - 如何返回空的 ActiveRecord 关系?

sql - 获取第一行的条件 SUM

sql-server - 在 SQL Server 中,如何以类似于 Oracle 的 "SELECT FOR UPDATE WAIT"的方式锁定单行?