代码之家  ›  专栏  ›  技术社区  ›  Stéphan Kochen

delayedjob和'master_slave_adapter';丢失主连接

  •  0
  • Stéphan Kochen  · 技术社区  · 14 年前

    我们有一个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 ,因为据说它不会在重新连接后设置连接字符集,就像在第一次连接初始化时一样。

    正确的方法是什么?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Stéphan Kochen    14 年前

    我们现在是猴子补丁 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