You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails应用间歇性出现“No connection pool for 'ActiveRecord::Base' found”错误求助

环境配置
  • Rails 7.0.3.1
  • Ruby 3.1.2
  • pg gem 1.3.5
  • puma gem 4.3.12
  • 部署环境:Azure,Web应用运行在AKS中,PostgreSQL实例部署在通用型虚拟机上
问题现象

应用执行数据库相关操作时,间歇性抛出 "No connection pool for 'ActiveRecord::Base' found" 错误。轻量压测时问题加剧:当连接数达到一定阈值后,几乎所有请求都会触发该错误。当前触发错误的连接数远低于配置的池上限,且按预期本该出现「Connection timeout」错误而非当前提示,怀疑是配置问题导致。

当前配置

database.yml 对应环境配置:

[env]:
  adapter: postgresql
  encoding: utf8
  pool: 100
  database: <%= [Value from ENV] %>
  username: <%= [Value from ENV] %>
  password: <%= [Value from ENV] %>
  host: <%= [Value from ENV] %>
  sslmode: require
  • Puma 使用默认配置,未自定义 puma.rb
排查与解决建议

1. 对齐Puma进程数与数据库连接池的总容量

Puma默认是多进程+多线程模式,每个Puma进程会维护独立的数据库连接池,总连接数 = Puma进程数 × database.yml中配置的pool值。如果总连接数超过PostgreSQL实例的max_connections上限,会导致连接池逻辑异常,出现找不到连接池的错误。

  • 先查询PostgreSQL的最大连接数:执行SHOW max_connections;
  • 自定义Puma配置,确保 进程数 × pool值 ≤ max_connections × 0.8(预留20%连接给管理员等其他场景)
    示例puma.rb配置:
    workers Integer(ENV['WEB_CONCURRENCY'] || 2)
    threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
    threads threads_count, threads_count
    

2. 确保Puma Worker进程重新初始化连接池

Puma主进程fork出worker后,若未重新初始化数据库连接池,会导致多个worker共享同一连接池实例,引发连接池异常。

  • 在config/puma.rb中添加worker启动时的连接重置逻辑:
    on_worker_boot do
      ActiveRecord::Base.establish_connection
    end
    
    该配置会让每个worker进程启动时重新建立独立的数据库连接池,避免进程间共享连接的问题。

3. 排查代码中的连接泄漏问题

如果代码存在未正确释放数据库连接的场景(比如手动获取连接后未归还、异常分支未回收连接),会导致连接池被耗尽,进而触发异常。

  • 启用ActiveRecord连接池日志,跟踪连接的获取与释放:
    # config/environments/[env].rb
    ActiveRecord::Base.logger = Logger.new(STDOUT)
    ActiveRecord::Base.logger.level = Logger::DEBUG
    
    查看日志中是否存在acquired connection但无对应released connection的记录,定位泄漏点。
  • 对于手动操作连接的代码,改用块式调用自动回收连接:
    ActiveRecord::Base.connection_pool.with_connection do |conn|
      # 执行数据库操作
    end
    

4. 验证pg gem与Rails版本兼容性

部分pg gem版本与Rails 7.x组合可能存在连接池相关的隐性bug,建议调整pg gem版本测试:

  • 尝试升级pg gem到最新兼容版本(如1.5.x系列),或降级到稳定版本,重新部署验证问题是否消失。

5. 添加数据库连接超时与失效清理配置

AKS与PostgreSQL虚拟机之间的网络波动可能导致连接被强制断开,若连接池未及时清理失效连接,会引发异常。在database.yml中添加以下配置:

[env]:
  # 原有配置保留
  connect_timeout: 5
  checkout_timeout: 5
  reaping_frequency: 10
  • connect_timeout:数据库连接超时时间(秒)
  • checkout_timeout:从连接池获取连接的超时时间(秒)
  • reaping_frequency:连接池自动清理失效连接的频率(秒)

内容的提问来源于stack exchange,提问作者mikeappell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:27:32