我有一个带有PostgreSQL数据库的Rails API。
对API的某些请求显示了一种奇怪的行为,不依赖于端点。
这些请求(约占总请求的5-10%)以相同的7个数据库查询:
在执行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分钟内未收到任何请求并且所有连接均已获得,则下一个请求将需要实例化新的连接并因此运行查询。
如何减少启动连接的数量?
您可以在idle_timeout
中设置0
的database.yml
。这将防止ActiveRecord获得连接,但根据正在运行的进程数和PG max_connections
的值,可能会导致问题。
是否可以缓存查询?
有一个封闭的问题正在讨论,但是现在看来不可能将其缓存。https://github.com/rails/rails/issues/35311