11

我有一个 Rails 应用程序现在只在内部运行,所以现在没有那么多访问。并且有两个 resque 工作人员几乎不运行从 web 获取数据并插入到 mysql 数据库中,每次插入都会休眠 10 秒。

我们在 VPS 上运行它。每隔 5 小时,我会遇到一个 Exception Exception occured: [Mysql2::Error] closed MySQL connection"

导致异常的原因可能是什么?现在池大小为 5。

如果我提高池大小并reconnect: true在我的database.yml?

4

3 回答 3

12

这是将 mysql2 gem 版本 0.2.11 或更低版本与多线程结合使用时的常见问题。问题跟踪器上有一个错误,其中包含有关问题的详细信息,但总而言之,建议是:

  1. 更新您正在使用的 gem 版本>= 0.2.12
  2. 在文件中添加reconnect: true您的数据库连接配置选项database.yml

您可能已经解决了您的问题,但这可能会帮助遇到此问题的其他人。

于 2013-11-04T17:18:01.123 回答
1

如果您的工作人员长时间不活动,他们将失去他们的 MySQL 连接。

请参阅此处以获取解决方案

或者只是将其粘贴在初始化程序中

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 
于 2012-08-02T10:48:29.190 回答
0

更深入地了解如何为delay_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

我注意到特定过程在我最近一次部署前几天就开始了。一旦我杀死它,错误就消失了。我假设在我的具体情况下发生的是我最新的部署没有正确删除所有延迟作业实例。

于 2017-02-01T20:47:23.107 回答