我正在开发一个 Rails 应用程序,其中每个子域都有一个单独的数据库。我正在做这样的事情。
#app/controller/application_controller.rb
class ApplicationController < ActionController::Base
before_filter :select_database
private
def select_database
MyModel.use_database(request.subdomains.first)
end
end
#app/model/my_model.rb
class MyModel < ActiveRecord::Base
def self.use_database path
establish_connection :adapter => 'sqlite3', :database =>
File.join(RAILS_ROOT, "db", "sqlite3", path)
end
end
现在,在production
模式下,请求按此顺序来执行。
- 请求“A”针对子域a.example.net并
MyModel
与数据库“a”建立连接。 - 现在另一个请求“B”针对子域b.example.net并
MyModel
与数据库“b”建立连接。 - 现在,如果请求“A”尝试执行
MyModel.find_*()
它将访问哪个数据库?“a”还是“b”?
我相信这就是我们所说的“线程安全”或“竞争条件”,如果是这样,那么在每个子域使用一个数据库实现应用程序时,我们如何避免它呢?
在上述问题中,我的假设是同时执行两个请求是生产服务器的正常行为。或者有没有更好的方法。我对生产服务器没有太多经验,所以请指教。