【问题标题】:rufus-scheduler and multiple databases connectionsrufus-scheduler 和多个数据库连接
【发布时间】:2015-08-15 19:01:09
【问题描述】:

在我的 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

【问题讨论】:

    标签: ruby-on-rails ruby rufus-scheduler


    【解决方案1】:

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

    这样 rufus 调度程序不需要知道连接。

    【讨论】:

      【解决方案2】:

      兰比说:

      在我的 Rails 多租户应用程序中,我使用多个数据库和 我使用 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 或数据库连接,它只是使用线程来完成其调度工作。没有魔法。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 取决于单个操作的持续时间和租户数量...如果有70个租户,单个操作运行1分钟...玩得开心!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 2012-06-30
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多