如何在heroku上增加ActiveRecord线程池大小

如何在heroku上增加ActiveRecord线程池大小,activerecord,heroku,connection-pooling,Activerecord,Heroku,Connection Pooling,通常我会将池大小设置为 development: adapter: postgresql encoding: unicode database: openkitchen_development username: rails host: localhost pool: 10 password: 在database.yml中。但是,heroku将替换配置文件。我用女孩星期五来 做后台数据库工作,需要增加线程池大小。这不是很简单,但您可以尝试创建自己的构建包 你将需要分

通常我会将池大小设置为

development:
  adapter: postgresql
  encoding: unicode
  database: openkitchen_development
  username: rails
  host: localhost
  pool: 10
  password:
在database.yml中。但是,heroku将替换配置文件。我用女孩星期五来
做后台数据库工作,需要增加线程池大小。

这不是很简单,但您可以尝试创建自己的构建包

你将需要分叉:

然后修改以下内容:

只需添加所需的池大小

然后,您可以使用自定义buildpack创建新的Heroku应用程序:

heroku create --stack cedar --buildpack https://github.com/yourgithubusername/heroku-buildpack-ruby.git

应该是这样

只需在heroku配置中的
数据库URL
中添加一个
查询参数即可。要在heroku应用程序中将池大小设置为15,请使用以下命令:


heroku-config-s | awk'/^DATABASE|URL=/{print$0”?pool=15“}”\xargs-heroku-config:add

remvee的答案触及了需要解决的核心问题,但由于他的命令导致我的控制台挂起,我想我会手工写下如何实现这一点

heroku config
查找数据库URL键。对于本例,假设它是:

DATABASE_URL:            mysql2://something.example.com/stuff?reconnect=true
将“&pool=10”添加到URL的末尾(使用&而不是?,因为URL已经有一个参数)


无论如何,Heroku不推荐使用其他答案中描述的URL参数方法。他们保留随时重置或更改此URL的权利,从长远来看,此行为可能会因Rails构建行为而被删除

建议通过初始化后应用程序回调设置其他参数,以修改heroku postgresql数据库的配置

在config/initializers/database_connection.rb中:

Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    config = Rails.application.config.database_configuration[Rails.env]
    config['pool']              = 10
    ActiveRecord::Base.establish_connection(config)
  end
end

Heroku现在有一篇关于管理池大小的好文章-

我不明白这是怎么回事。
DATABASE\uurl
是一个跨所有dynos和worker共享的配置,不会影响Rails进程的池大小。每个Heroku DB计划都有一个最大连接限制。我怀疑调整数据库URL会增加该限制。你是对的,它不会增加数据库的最大连接限制。它所做的是告诉每个进程创建自己的大小相同的池。因此,如果数据库的最大连接限制为20,并且有4个动态节点,则可以将池大小设置为5。但是,您可能只需要4个,因为一次性进程(调度程序、heroku运行等)也需要DB连接。请注意,heroku现在不鼓励更改
数据库的URL
。它将连接池配置留给用户代码:
Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    config = Rails.application.config.database_configuration[Rails.env]
    config['pool']              = 10
    ActiveRecord::Base.establish_connection(config)
  end
end