【问题标题】:DelayedJob and `master_slave_adapter`; losing the master connectionDelayedJob 和 `master_slave_adapter`;失去主连接
【发布时间】:2010-11-23 05:00:16
【问题描述】:

我们有一个 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')

我听说过在我的database.yml 中使用reconnect 选项的坏事,因为据称它在重新连接后不会设置连接字符集,就像在第一次连接初始化时那样。

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

【问题讨论】:

    标签: mysql ruby-on-rails delayed-job master-slave


    【解决方案1】:

    FWIW,我们现在在两个重要的地方修补 Delayed::Job。这是blob:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2015-09-20
      • 2013-05-07
      • 2023-01-23
      • 2014-02-28
      • 2015-07-29
      • 1970-01-01
      相关资源
      最近更新 更多