完美计算 Rails 数据库连接池大小的秘诀

主要观点:Ruby on Rails 为 Active Record 维护一个数据库连接池,连接从池中借出使用后归还,池大小在config/database.yml中配置,默认值与RAILS_MAX_THREADS有关。数据库连接池大小常被错误配置,作者曾花费大量时间试图精确计算,发现几乎不可能做到。

关键信息

  • 连接池用于查询数据库,通常每个线程一个(即将改为每个事务一个)。
  • 默认池大小在 Rails 7.2 中为pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  • 配置池大小错误可能导致等待连接或出现ActiveRecord::ConnectionTimeoutError

重要细节

  • pool:配置值是数据库连接池的最大大小,连接按需创建并添加到池中,池会自动移除空闲和未使用的连接。
  • 可能在数据库层面耗尽可用连接,如 Heroku 的Essentials-0Postgres 数据库只有 20 个连接。
  • 若应用使用过多并发数据库连接,应配置和调整使用连接的东西,而非数据库连接池本身。
  • 若仍不够连接,可增加数据库连接数或使用连接复用器。
  • 若担心空闲连接在池中保留时间过长,可配置idle_timeout(默认 5 分钟,设为 0 可永久保留)和reaping_frequency(默认 1 分钟)。
  • Rails 维护者有意完全移除此配置选项,建议将池大小设为很大的固定值,不再担心精确值。
阅读 15
0 条评论