我有一个带有 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/