我有一个Rails应用程序现在只在内部运行,所以现在没有那么多的访问。并且有两个resque工作器几乎不能从Web获取数据并插入到mysql数据库中,每个插入后都会睡10秒钟。
我们在VPS上运行它。在每5个小时后,我会遇到异常Exception occured: [Mysql2::Error] closed MySQL connection"
。
导致异常的原因是什么?现在池大小为5.
如果我提高池大小并在reconnect: true
中指定database.yml
,会有帮助吗?
答案 0 :(得分:11)
将mysql2 gem版本0.2.11或更低版本与多线程结合使用时,这是一个常见问题。 a bug on the issue tracker有关于问题的详细信息,但总的来说建议是:
>= 0.2.12
reconnect: true
文件database.yml
选项
醇>
您可能已经解决了问题,但这可能有助于遇到此问题的其他人。
答案 1 :(得分:1)
如果您的员工长时间处于非活动状态,他们将失去MySQL连接。
请参阅here了解解决方案
或者只是将其粘贴在初始化程序中
unless Rails.env.to_s == 'test'
module ActiveRecord::ConnectionAdapters
class Mysql2Adapter
alias_method :execute_without_retry, :execute
def execute(*args)
execute_without_retry(*args)
rescue Exception => e
if e.message =~ /server has gone away/i
warn "Server timed out, retrying"
reconnect!
retry
else
raise e
end
end
end
end
end
答案 2 :(得分:0)
更深入了解如何针对 delayed_job 调试此内容。在reconnect: true
上设置database.yml
后,我执行了以下操作,此解决方案无效。
cd /your_rails_deploy_code/log
cat production.log
# check the pids from delayed job:
E, [2017-02-01T19:45:21.614579 #2592] ERROR -- : 2017-02-01T19:45:21+0000: [Worker(delayed_job.3 host:demeter pid:2592)] Job ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper (id=193675) FAILED (0 prior attempts) with Mysql2::Error: closed MySQL connection
就我的具体情况而言,pid:2592
是唯一一个经常失败的人。为什么?我们来看看:
[deploy@demeter] ps -ef | grep 2592
deploy 2592 1 0 Jan31 ? 00:00:40 production/delayed_job.3
deploy 23312 1 0 Feb01 ? 00:00:40 production/delayed_job.1
deploy 23318 1 0 Feb01 ? 00:00:40 production/delayed_job.0
我注意到在我最近部署之前几天开始的具体流程。一旦我杀了它,错误就消失了。我假设发生在我的具体案例中的是我的最新部署没有正确删除所有delayed_job实例。