Heroku Rails - 关闭Active Record Postgres连接

时间:2017-06-05 11:34:37

标签: ruby-on-rails postgresql heroku activerecord connection-pooling

我有一个我在heroku上托管的rails 4应用程序。在使用多线程服务器时,他们提供了有关如何管理数据库连接池的一些具体建议(美洲狮)https://devcenter.heroku.com/articles/concurrency-and-database-connections

当我为我的应用程序运行负载测试时出现错误 - 无法连接到数据库。当每个页面被点击时,rails会初始化活动记录,即使我没有在该页面上进行任何查询,也不会引用任何模型。

我的问题是:

如何制作一种白名单(或黑名单),以便不使用数据库连接为这些特定控制器操作初始化活动记录?在初始化程序中?

理想情况下,我会在heroku(40个连接)上运行更便宜的postgres服务,因为我知道我的应用程序不经常使用数据库。如果流量高达40个连接将开始出错,这对于那些不会在这些请求上使用db的应用程序来说似乎很愚蠢。

我了解了如何为整个应用禁用有效记录:Disable ActiveRecord for Rails 4

但我该如何有选择地启用它呢?这里是否有任何其他不同的性能考虑因素(不要急于加载这些东西或任何其他陷阱)

1 个答案:

答案 0 :(得分:0)

在你application_controller.rb

before_filter :maybe_disconnect_db

def maybe_disconnect_db
  ActiveRecord::Base.remove_connection() if ActiveRecord::Base.connected?
end

def maybe_connect_db
  ActiveRecord::Base.establish_connection() unless ActiveRecord::Base.connected?
end

然后对于需要数据库连接的每个控制器/操作添加

skip_before_filter :maybe_disconnect_db, #only or unless filter here
before_filter      :maybe_connect_db,    #only or unless filter here

这应该为任何特定的db请求建立连接,并为任何不需要它的请求断开连接,同时还在没有操作的情况下连续处理多个db请求,并且在没有操作的情况下连续处理多个非db请求。 / p>

ActiveRecord::Base.remove_connection

ActiveRecord::Base.establish_connection