Rails API中的慢速和频繁PostgreSQL数据库连接启动

问题描述 投票:1回答:1

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

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

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

  • SET client_min_messages TO吗?
  • SET standard_conforming_strings =开
  • 将会话时区设置为?
  • SELECT t.oid,t.typname来自pg_type WHERE 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

如何减少启动连接的数量?有没有一种方法可以缓存查询?

谢谢,

ruby-on-rails postgresql amazon-rds
1个回答
0
投票

遇到同一件事,这就是我想发生的事情:

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

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

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

如何减少启动连接的数量?

您可以在idle_timeout中设置0database.yml。这将防止ActiveRecord获得连接,但根据正在运行的进程数和PG max_connections的值,可能会导致问题。

是否可以缓存查询?

有一个封闭的问题正在讨论,但是现在看来不可能将其缓存。https://github.com/rails/rails/issues/35311

© www.soinside.com 2019 - 2024. All rights reserved.