ActiveRecord和jRuby线程/光纤(Rails 4)

时间:2013-06-20 11:12:31

标签: ruby-on-rails ruby jruby celluloid

我正在使用jRuby和Celluloid(默认的task_class,所以它应该是光纤)。

我正在将我的数据库内容包装在ActiveRecord :: Base.connection_pool.with_connection中,但我可能在某个地方错过了它(如何找到它?)。

我有时会收到ActiveRecord :: ConnectionTimeoutError错误,我想避免这种情况。从理论上讲,我的database.yml池设置应该足够高,以适应我拥有的线程数量。

在(真实)线程情况下使用ActiveRecord的正确方法是什么?如果可能的话,当我没有明确使用ActiveRecord :: Base.connection_pool.with_connection时,我希望避免ActiveRecord自动检出连接。请注意,这是一个后台应用程序,而不是为Web客户端提供服务的传统Rails应用程序。

我正在使用jRuby和Rails 4 rc1。对于DB我在Heroku上使用生产级Postgres,因此DB的性能应该不是问题。

1 个答案:

答案 0 :(得分:2)

如果您在Heroku上部署您的应用程序(我假设您正在使用Heroku Postgres),那么部署应用程序时将覆盖您的database.yml文件。

Heroku注入了一个新的database.yml,用于解析DATABASE_URL环境变量,因此您的设置都不适用于生产。

Heroku Devcenter中有一篇关于此内容的文章。

基本上,您需要更新活动记录配置并在加载应用程序后重新建立连接。这种方法的一个很好的好处是,您可以轻松更改连接池而无需进行额外部署,只需运行:

heroku config:add DB_POOL=24

使用新的池级别重新启动应用程序。