【问题标题】:ActiveRecord inside the thread is too slow线程里面的ActiveRecord太慢了
【发布时间】:2014-11-15 03:19:02
【问题描述】:

我有问题。我有几个代码块必须并行和独立工作,但可以有一些连接点,如线程安全队列。我没有使用rails,那只是一个ruby脚本。但我正在使用活动记录。当我在主 ruby​​ 线程中调用 activerecord 模型时,一切正常,选择大约需要 0.3 毫秒。但是,如果我在创建的线程中调用 activerecord 模型,例如:

Thread.new do
  3.times {
    SomeModel.find(3)
  }

end

现在需要 400 毫秒。为什么会发生这种情况以及该怎么做才能缩短请求执行时间?

【问题讨论】:

  • ActiveRecord 连接池可能太小。 ActiveRecord 默认池大小为 5。如果打开的连接不可用,ActiveRecord 将阻塞等待连接。尝试通过在连接参数中指定 pool: 选项来增加池大小。
  • 您使用的是哪个 AR 版本?
  • ActiveRecord 版本是 4.1.6。这不是池问题,因为我已经将池设置为 100。并且只发出 3 个请求。

标签: ruby multithreading activerecord


【解决方案1】:

我发现这是 ActiveRecord 从主线程获取连接,它在那里建立了连接。在每个线程中重新建立连接就可以了。另一种方法是覆盖activerecord中的current_connection方法来共享线程之间的连接。

【讨论】:

  • 你的意思是它在等待连接变为空闲吗?还是有某种同步锁在发生?
  • 还没有深入这个问题,正在考虑,但没有时间研究,抱歉......但这是AR使用线程的特殊之处。
  • 好吧,我不确定我是否理解,但请记住这一点。我感觉您的问题将来可能会受到更多关注,因此,如果您发现更多信息,我相信如果您保持更新,它将使很多人受益。祝你好运。
  • 抱歉,我重读了我的评论,然后... 看起来我写的时候喝醉了 :) 我想说我没有深入探讨这个问题。并感谢您的评论:)
  • 呵呵,没关系,至少我明白了这么多。我的意思是我仍然对这种行为感到好奇。我想我应该更具体地问一下,这是 ActiveRecord 从主线程获取连接是什么意思?这就是为什么我问这是否是某种同步问题,因为这就是我对那条线的看法。你能详细说明你帖子的那部分是什么意思吗?
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 2018-10-25
  • 2013-03-10
  • 2014-06-07
  • 2016-05-31
  • 2011-07-07
  • 2015-08-23
  • 2012-07-05
相关资源
最近更新 更多