ruby-on-rails - Rails API 中 PostgreSQL 数据库连接启动缓慢且频繁

标签 ruby-on-rails postgresql amazon-rds

我有一个带有 PostgreSQL 数据库的 Rails API。

对 API 的一些请求显示出奇怪的行为 不依赖于端点。

这些请求(约占总请求的 5-10%)以 相同的 7 个数据库查询:

  • 将 client_min_messages 设置为?
  • SET standard_conforming_strings = on
  • 将 session 时区设置为?
  • 从 pg_type 中选择 t.oid、t.typname,其中 t.typname IN (?) ...

在执行 7 个查询之前,该请求也需要很长时间才能启动。

这似乎是数据库适配器发起连接。 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter

这会显着减慢查询速度。

我使用的是带有默认参数的 PostegreSQL 11.6 AWS RDS 实例。

这是我的database.yml配置:

default: &default
  adapter: postgresql
  encoding: unicode
  username: *****
  password: *****
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

production:
  <<: *default
  database: *****
  username: *****
  password: *****
  pool: 50

如何减少启动连接的数量? 有没有办法缓存查询?

谢谢,

最佳答案

遇到了同样的事情,我认为正在发生的事情是这样的:

每次实例化新连接时,它都会执行您上面提到的引导查询。假设未生成新进程,则需要实例化新连接,因为 ActiveRecord 已获取现有连接。

默认情况下,ConnectionPool::Reaper 将断开任何空闲时间超过 5 分钟的连接。 请参阅:https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

如果您的 API 在 5 分钟内没有收到任何请求,并且所有连接都已获得,则下一个请求将需要实例化新连接并因此运行查询。

How do I reduce the number of connections initiating ?

您可以在 database.yml 中将 idle_timeout 设置为 0。这将阻止 ActiveRecord 获取连接,但可能会导致问题,具体取决于正在运行的进程数量以及 PG max_connections 值。

Is there a way to cache the queries ?

有一个已解决的问题讨论了这个问题,但看起来今天不可能缓存这些。 https://github.com/rails/rails/issues/35311

关于ruby-on-rails - Rails API 中 PostgreSQL 数据库连接启动缓慢且频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946869/

相关文章:

ruby-on-rails - 这是多列索引的合适场景吗?

java - 在 postgresql (spring) 中设置默认模式

amazon-web-services - Amazon AWS RDS 创建数据库权限被拒绝

ruby-on-rails - 如何更改列的顺序

mysql - 缩放自动增量

mysql - 为什么 Amazon RDS 内存监控阈值显示为红色?

amazon-web-services - 未找到 DBCluster 的 ReadEndpoint.Address

ruby-on-rails - 如何运行 ruby​​ 文件?

iphone - 使用用户 token 、rest/rails 和钥匙串(keychain)帮助进行 iOS 身份验证

ruby-on-rails - nginx 错误 : (13: Permission denied) while connecting to upstream)