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