如何防止" Mysql2 ::错误:此连接正在使用"与Sidekiq

时间:2014-03-31 23:09:29

标签: mysql multithreading ruby-on-rails-4 database-connection sidekiq

在运行Sidekiq几个小时后,我看到一堆作业因Mysql2::Error: This connection is in use by: #<Celluloid::Thread:0x0000000d1b56e0 sleep>而失败。似乎Sidekiq线程在MySQL连接池上存在某种冲突。

concurrency在sidekiq.yml中设置为默认值25,在database.yml中池为28。没有长期存在的查询,标准查找程序调用中会发生异常,没什么特别的。

如何防止此错误以确保作业顺利进行?

3 个答案:

答案 0 :(得分:0)

您的问题是由于sidekiq获得了与您的数据库的所有连接,同时rails应用程序也请求连接。

你有25名sidekiq工作人员,但你有多少铁路服务器?

e.g。如果你有独角兽跑4个童工你需要29个插槽(至少)

答案 1 :(得分:0)

最后通过隔离所有工人来解决这个问题。它归结为Typhoeus图书馆显然不是线程安全的。替换为Net / HTTP,它再次有效。

https://github.com/mperham/sidekiq/issues/1400#issuecomment-45838886

的更多详情

答案 2 :(得分:0)

在我们的案例中,我们在特定的工作者类型中遇到了很多这些错误。我们发现我们在这些worker中运行的一个作业中使用了Timeout.timeout()调用。我们删除了这些调用,之后这些错误就消失了。有关为什么Timeout.timeout()调用是危险的一些参考,请查看herehere