Gem 使用 Sidekiq 发生 ActiveRecord::ConnectionTimeoutError

grant · 2013年03月06日 · 最后由 yedingding 回复于 2013年03月07日 · 3050 次阅读

我最近使用sidekiq实现delay任务。

例如:一个model新建的时候需要下载网上的图片到本地。这个图片下载就用sidekiq的worker来做,这样新建的时候无需等待。利用after_commit调用这个worker。这个worker里面有数据库查询的操作。

但这个项目里面有个cron job,每晚半夜会调用一个task,这个task会自动新建很多这个model,这样的话,就会多次调用上面所说的worker.

这时候就会发生如下错误,这个错误发生在worker里面用model查询数据的地方(User.find(id))。

An ActiveRecord::ConnectionTimeoutError occurred in background at 2013-03-05 08:19:42 UTC :

  could not obtain a database connection within 5 seconds. The max pool size is currently 5; consider increasing it.
  /var/www/testproject/shared/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:252:in `block (2 levels) in checkout'

我猜测原因是一个worker是独立的线程会占用一个connection,一旦很多worker被调用,这样的话,connection就不够用了。

有高手指点不?有解决方法吗?

共收到 1 条回复

database.yml 里面的 pool 适当大于 worker 的 concurrency,一般大个 5 就差不多了,准确点是 2

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册