为Rails应用配置Heroku PGbouncer后,控制台无法访问ActiveRecord及模型
解决Heroku PGbouncer事务池模式下Rails控制台无法访问ActiveRecord的问题
我之前也碰到过一模一样的情况——给Rails应用装了PGbouncer做事务池优化后,用heroku run console进控制台,结果ActiveRecord和所有模型都用不了,折腾了好一会儿才摸清楚原因。本质上是事务池模式的PGbouncer和Rails控制台的长期会话不兼容,或者控制台进程没正确配置连接参数。下面是几个靠谱的解决办法:
方法1:启动控制台时直接连接原始Postgres(最快捷)
PGbouncer Buildpack会把原始的Postgres数据库地址存在带颜色的环境变量里(比如HEROKU_POSTGRESQL_BLUE_URL,具体名字可以用heroku config | grep HEROKU_POSTGRESQL查看)。启动控制台时直接指定这个URL,绕过PGbouncer:
# 先确认你的原始数据库变量名 heroku config | grep HEROKU_POSTGRESQL # 替换成你的变量名启动控制台 heroku run DATABASE_URL=$(heroku config:get HEROKU_POSTGRESQL_BLUE_URL) rails console
这样控制台直接连原始Postgres,就能正常使用ActiveRecord和所有模型了,完全不用改任何配置。
方法2:让控制台通过PGbouncer会话池连接(适合必须走PGbouncer的场景)
如果你一定要让控制台走PGbouncer,那需要为控制台单独配置会话池(默认事务池不支持长期会话):
- 先给控制台进程标记环境变量:
heroku config:set PGBOUNCER_CONSOLE_MODE=true
- 修改
pgbouncer.ini配置(如果Buildpack允许自定义),添加会话池规则:
[databases] * = host=your-postgres-host port=5432 console_db = host=your-postgres-host port=5432 pool_mode=session [users] console_user = pool_mode=session
- 启动控制台时指定会话池的数据库URL:
heroku run DATABASE_URL=$(heroku config:get PGBOUNCER_DATABASE_URL)_console rails console
这个方法需要对PGbouncer配置熟悉,一般推荐方法1更省心。
方法3:检查ActiveRecord连接配置
确保config/database.yml的生产环境配置是动态读取环境变量的,没有硬编码:
production: url: <%= ENV['DATABASE_URL'] %> pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> connect_timeout: 5
这样不管你用哪个数据库URL,ActiveRecord都能正确初始化连接。
另外提个小注意:如果用方法1直接连Postgres,就不用顾虑事务池的连接占用问题;要是用PGbouncer的事务池,别在控制台里留着未提交的长期事务,否则会占着连接影响其他进程。
内容的提问来源于stack exchange,提问作者ChalkyBrush
相关产品推荐
相关产品推荐

