2010-06-29 29 views
0

我们有一个Rails应用程序,它使用master_slave_adapter插件在MySQL主从设置中运行一段时间。最近,需要对长时间运行的任务进行后台处理。所以我们结算了DelayedJobDelayedJob和`master_slave_adapter`;失去主连接

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

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