主要观点: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-0
Postgres 数据库只有 20 个连接。 - 若应用使用过多并发数据库连接,应配置和调整使用连接的东西,而非数据库连接池本身。
- 若仍不够连接,可增加数据库连接数或使用连接复用器。
- 若担心空闲连接在池中保留时间过长,可配置
idle_timeout
(默认 5 分钟,设为 0 可永久保留)和reaping_frequency
(默认 1 分钟)。 - Rails 维护者有意完全移除此配置选项,建议将池大小设为很大的固定值,不再担心精确值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。