0

我们有一个 Rails 应用程序在 MySQL 主从设置中运行了一段时间,使用master_slave_adapter插件。最近,需要对长时间运行的任务进行后台处理。所以我们选择了DelayedJob

DelayedJob 的表/模型使用相同的主从适配器。它通过轮询表来保持从属连接处于活动状态。但是主连接长时间保持空闲,一夜之间关闭,下次有人激活作业时会发生这种情况:

Mysql::Error: MySQL server has gone away: UPDATE `delayed_jobs` SET locked_by = null, locked_at = null WHERE (locked_by = 'delayed_job host:[snip] pid:20481')

我听说过reconnect在我database.yml的 .

使这项工作的正确方法是什么?

4

1 回答 1

1

FWIW,我们现在Delayed::Job在两个重要的地方打补丁。这是斑点:

module Delayed
  class Job < ActiveRecord::Base
    class << self
      def refresh_connections_for_delayed_job
        # Do a cheap check to see if we're actually using master-slave.
        if (c = self.connection).respond_to? :master_connection
          c.master_connection.reconnect! unless c.master_connection.active?
        end
      end

      def clear_locks_with_connection_refresh!(worker_name)
        self.refresh_connections_for_delayed_job
        self.clear_locks_without_connection_refresh!(worker_name)
      end

      alias_method_chain :clear_locks!, :connection_refresh
    end

    def lock_exclusively_with_connection_refresh!(max_run_time, worker)
      self.class.refresh_connections_for_delayed_job
      self.lock_exclusively_without_connection_refresh!(max_run_time, worker)
    end
    alias_method_chain :lock_exclusively!, :connection_refresh
  end
end
于 2010-11-22T21:00:16.620 回答