rufus-scheduler 和多个数据库连接

rufus-scheduler and multiple databases connections

在我的 rails 多租户应用程序中,我使用多个数据库,并使用 ActiveRecord::Base.establish_connection(tenant_config) 从一个数据库切换到另一个数据库,这个工作正常。 如何在 rufus-scheduler 中处理这个多重连接?我是否必须在每个调度程序中迭代连接?

#not work
scheduler.every '1h' do
    MyModel.create(title: "test")
end

可能是这样的:

scheduler.every '1h' do
    active_records_all_connections.each do
      MyModel.create(title: "test")
    end
end

谁能帮我提供更好的解决方案或建议。 谢谢

我使用这段代码来管理我的多个数据库连接

module DatabaseSwitching

  def choose_database_from_tenant(tenant)
    unless defined? @@_client_database_details
      @@_client_database_details = Hash.new
    end
    if @@_client_database_details[tenant].nil?
      @@_client_database_details[tenant] = fetch_tenant_database_for tenant
    end
    connect_to_database_for @@_client_database_details[tenant]

  end

  def fetch_tenant_database_for(tenant)
    file_path = "#{Rails.root}/config/databases/database.yml"
    raise ActionController::RoutingError.new('Not Found') unless tenant
    tenant_db = "database_" + tenant

    if @file_to_load != File.ctime(file_path)
      @details = YAML.load_file(file_path)[tenant_db]
      @file_to_load = File.ctime(file_path)
      raise ActionController::RoutingError.new('Not Found') unless @details
    end
    @details
  end


  def connect_to_database_for(details)
    ActiveRecord::Base.establish_connection(details)
 end
end

我会将数据库连接分离移至模型。类似这样article

这样 rufus scheduler 就不需要知道连接了。

兰比说:

In my rails multi-tenant application, I use multiple databases and I switch from one to another using ActiveRecord::Base.establish_connection(tenant_config)

因此,只需执行以下操作:

scheduler.every '1h' do
  ActiveRecord::Base.establish_connection(tconfig0)
  MyModel.create(title: "test for tenant0")
end
scheduler.every '1h' do
  ActiveRecord::Base.establish_connection(tconfig1)
  MyModel.create(title: "test for tenant1")
end

您在常规代码中使用 .establish_connection 切换,为什么不在计划的作业中使用它?

请注意,rufus-scheduler 不关心 Rails 或 Active Record 或数据库连接,它只是使用线程来完成其调度工作。没有魔法。

不知道对性能有没有好处!我会这样做:

 # for each tenant (db connection) 
     scheduler.every '1h' do
            Tenant.each do |tconfig|
              ActiveRecord::Base.establish_connection(tconfig)
              MyModel.create(title: "test")
            end
        end